Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Искажение сохраненного контекста в прерывании
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
EugeneB
Написан код под 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. ......у какого какие еще мысли, может, кто сталкивался с этим.
Есть идея, конечно, запихнуть весь контекст при обработке прерывания в отдельную область памяти, как думаете?
aaarrr
Цитата
прикол весь в том, что это сообщение выводитсья иногда раз в час, иногда раз в 2, 3 часа при том, что "bool=1!" вообще НЕ выводится. Не понимаю вообще какого черта

Переменная boolTest, скорее всего, лежит в одном из регистров процессора, и если сообщение выводится раз в час, а не начинает выскакивать постоянно, значит содержимое этого регистра остается неизменным. Похоже, что в прерывании искажается значение CPSR.
Посмотрите asm листинги main и проверьте корректность процедуры сохранения/восстановления контекста.

Запихивать контекст прерывания в отдельную область памяти, по-моему, не лучшая идея. Тем более что это никак не поможет.
EugeneB
Цитата(aaarrr @ Oct 28 2006, 01:35) *
Цитата
... Похоже, что в прерывании искажается значение CPSR.
Посмотрите asm листинги main и проверьте корректность процедуры сохранения/восстановления контекста.

Спасибо за толчок к просмотру кода обработчика прерывания, а то я все так не хотел туда лезть. Я взял этот исправленный стартап на форуме, кажись здесь. При детальном рассмотрении выяснилось следующее: была строчка msr SPSR_c,r0, заменил на msr SPSR_cxsf,r0 и все заработало smile.gif.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.