реклама на сайте
подробности

 
 
> Искажение сохраненного контекста в прерывании, прямо таки проблемы с прерываниями, как из рога изобилия ))
EugeneB
сообщение Oct 27 2006, 21:41
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 6-08-06
Пользователь №: 19 356



Написан код под 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
aaarrr
сообщение Oct 27 2006, 22:35
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата
прикол весь в том, что это сообщение выводитсья иногда раз в час, иногда раз в 2, 3 часа при том, что "bool=1!" вообще НЕ выводится. Не понимаю вообще какого черта

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

Запихивать контекст прерывания в отдельную область памяти, по-моему, не лучшая идея. Тем более что это никак не поможет.
Go to the top of the page
 
+Quote Post
EugeneB
сообщение Oct 28 2006, 13:09
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 6-08-06
Пользователь №: 19 356



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

Спасибо за толчок к просмотру кода обработчика прерывания, а то я все так не хотел туда лезть. Я взял этот исправленный стартап на форуме, кажись здесь. При детальном рассмотрении выяснилось следующее: была строчка msr SPSR_c,r0, заменил на msr SPSR_cxsf,r0 и все заработало smile.gif.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 01:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.0132 секунд с 7
ELECTRONIX ©2004-2016