Написан код под 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. ......у какого какие еще мысли, может, кто сталкивался с этим.
Есть идея, конечно, запихнуть весь контекст при обработке прерывания в отдельную область памяти, как думаете?