Написан код под SAM7S, который принимает данные с двух USART и отвечает компу. Обработчик прерываний в стартапе исправлен. В основном цикле программы крутится проверка некоторой переменной... (THUMB режим, оптимизация по объему максимум, IAR Embedded Toolkit 4.40A) Скорость работы порта 115200 void InitUSART() { // все стандартно } void USART0IRQHandler0( void) { func1(); .....ответ компу } void USART1IRQHandler1( void) { func2(); .....ответ компу }
main() { UINT boolTest = 0;
.... инитим все while(1) { if ( func3() ) // данная функция никогда не выдает 1, просто заглушка (.....;return 1; ), чтобы компилер не /выкидывал boolTest { boolTest = 1; AT91F_DBGU_Printk( "bool=1!\n\r" ); } if ( boolTest ) AT91F_DBGU_Printk( "UUPS magic error!\n\r" ); }
} прикол весь в том, что это сообщение выводитсья иногда раз в час, иногда раз в 2, 3 часа при том, что "bool=1!" вообще НЕ выводится. Не понимаю вообще какого черта. Получаются такие варианты могут быть: 1. Каким-то образом затирается содержимое стека 2. Искажаются флаги после/до обработки прерывания 3. ......у какого какие еще мысли, может, кто сталкивался с этим. Есть идея, конечно, запихнуть весь контекст при обработке прерывания в отдельную область памяти, как думаете?
Сообщение отредактировал EugeneB - Oct 27 2006, 21:52
|