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

 
 
> AT91SAM7X256. Загадка для шпиона., Непонятное поведение после программного сброса
Aurochs
сообщение Dec 26 2009, 22:50
Сообщение #1


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



Имеется такой вот код (для GCC):
CODE
void Stop ( void )
{
.................................
.................................
AT91F_RSTSoftReset( AT91C_BASE_RSTC,
AT91C_RSTC_PROCRST );
// наивно ждем сброса
// но в нижеследующей команде возникает исключение "Undefined instruction"
asm volatile ( "B ." );
}

void undef_handler ( void )
__attribute__ (( interrupt( "UNDEF" ), naked ));
void undef_handler ( void )
{
.................................
.................................
Stop();
}


void pabort_handler ( void )
__attribute__ (( interrupt( "ABORT" ), naked ));
void pabort_handler ( void )
{
.................................
.................................
Stop();
}


void dabort_handler ( void )
__attribute__ (( interrupt( "ABORT" ), naked ));
void dabort_handler ( void )
{
.................................
.................................
Stop();
}

Когда в процессоре возникает какое-то из вышеупомянутых исключений (какое точно - неизвестно), то попадаем в функцию Stop и пытаемся сделать сброс. Да не тут то было - почему-то возникает безконечная последовательность исключений типа "Undefined instruction" на ассемблеровской команде ожидания, а сброса так и нет.
Уже дважды такой перл зафиксировал в боевой прошивке. Попытки воспроизвести подобное поведение в "лабораторных условиях" ни к чему не привели - все работает без фокусов. С горя добавил еще 2 ассемблеровских команды бесконечного цикла (типа после программирования контроллера сброса процессор вываливается в исключение в момент предвыборки, т.к. получается, что вслед за командой B . идут уже данные).
Вот теперь и мучаюсь - спасет ли это отца русской демократии? 07.gif

Сообщение отредактировал Aurochs - Dec 26 2009, 22:52
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Dec 26 2009, 23:02
Сообщение #2


Гуру
******

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



Отца русской демократии спасет чтение документации и отказ от идиотских функций AT91F_. Вы сбрасываете только процессор, вся периферия (в том числе и контроллер прерываний) продолжает как ни в чем не бывало работать.
Сбрасывайте все полностью:
Код
#define    at91_sw_reset()    {                                    \
    while(1)                                                \
        AT91C_BASE_RSTC->RSTC_RCR = (0xa5UL << 24) |        \
        AT91C_RSTC_PROCRST | AT91C_RSTC_PERRST;}
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Dec 27 2009, 12:52
Сообщение #3


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



Спасибо за ответ aaarrr, но, к сожалению, не могу признать, что Ваши безапелляционные суждения прояснили суть вопроса.
Цитата(aaarrr @ Dec 27 2009, 01:02) *
Отца русской демократии спасет чтение документации

Вообще-то я документацию не читаю (читают детективы перед сном). Я ее изучаю, причем стараюсь как можно тщательней.
Цитата(aaarrr @ Dec 27 2009, 01:02) *
и отказ от идиотских функций AT91F_.

Не собираюсь вступать в дебаты по этому поводу. Могу сказать только, что в данном конкретном случае это ничего не изменит, поскольку для вызова
Код
AT91F_RSTSoftReset( AT91C_BASE_RSTC, AT91C_RSTC_PROCRST |
                                         AT91C_RSTC_PERRST )

и
Код
AT91C_BASE_RSTC->RSTC_RCR = (0xa5UL << 24) |        \
        AT91C_RSTC_PROCRST | AT91C_RSTC_PERRST;

GCC генерирует совершенно одинаковый код.

Цитата(aaarrr @ Dec 27 2009, 01:02) *
Вы сбрасываете только процессор, вся периферия (в том числе и контроллер прерываний) продолжает как ни в чем не бывало работать.

Ну и что? В чем здесь криминал? Работающая периферия что ли приводит к тому, что возникает исключение "Undefined instruction" на команде безусловного перехода? А сброс периферии и внешний сброс я делаю один раз уже при запуске прошивки. Так удобнее при работе в отладчике.

Цитата(aaarrr @ Dec 27 2009, 01:02) *
Сбрасывайте все полностью:

Спасибо, я воспользуюсь Вашим кодом. Сам как-то не догадался поместить сброс внутрь цикла. Да, абстрактно это будет несколько понадежней, чем у меня. Но вот поможет ли?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 13th August 2025 - 15:59
Рейтинг@Mail.ru


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