Всем привет!
Вознила у меня проблема. Исходные данные:
- контроллер Renesas
H8S/2166 (16-ти битный)
- проект с большим количеством исходников (память 512КБ забита почти полностью)
- внешняя ОЗУ (данных)
- компилится всё это дело при помощи KPIT GNU Tools...
- схематически код выглядит так:
void funcA(int a){
...
debug_putch('A');
funcB(a);
// вот сюда уже может не вернуться!
// enable_interrupt();
debug_putch('a');
...
}
void funcB(int a){
debug_putch('B');
...
funcC(a);
...
debug_putch('b');
// disable_interrupt();
}
На отладочном порте (выводится в терминал по СОМ) вывод:
ABbaABbaABbaABbaABbaABb(перезагрузка)ABbaABba...
Что проверялось:
- стек пойнтер
- адрес возврата
- отключал прерывания
- регистры (те, которые необходимо сохранять/восстанавливать при входе/выходе фунции)
С упроством пьяного контроллер перезагружается в случайное время (т.е. может проходить через этот кусок кода хоть раз 100, а может пройтись парочку и на третьем ребутнуться) в одном и том же месте - все, что внутри funcB() выполняется на ура, а после вызова funcB() внутри funcА() - ничего.
Еще парочка пояснений: фунции в разных файлах (объектниках значица тоже), размер стека - большой (точно хватает, особенно учитывая тот факт, что адрес возврата проверяю во время выполнения - совпадает).