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

 
 
 
Reply to this topicStart new topic
> 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
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
aaarrr
сообщение Dec 27 2009, 14:37
Сообщение #4


Гуру
******

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



Цитата(Aurochs @ Dec 27 2009, 15:52) *
GCC генерирует совершенно одинаковый код.

Не сомневаюсь. Только человеком он читается совершенно по разному.

Цитата(Aurochs @ Dec 27 2009, 15:52) *
Ну и что? В чем здесь криминал? Работающая периферия что ли приводит к тому, что возникает исключение "Undefined instruction" на команде безусловного перехода?

Да легко. Например, если до этого был сделан remap. Или после включены прерывания в CPSR без сброса AIC. Или была сделана попытка перенастроить PLL, не переключившись на SCLK вручную. Достаточно криминала?
Откуда такая уверенность, что исключение возникает именно на "B ."? Я, например, почти уверен, что процессор каждый раз нормально сбрасывается, и лишь затем вылетает в трубу.

Цитата(Aurochs @ Dec 27 2009, 15:52) *
А сброс периферии и внешний сброс я делаю один раз уже при запуске прошивки. Так удобнее при работе в отладчике.

Через PERRST? Учитывая упомянутые выше варианты "криминала", без исходного кода стартапа дальше разбираться будет затруднительно.

Цитата(Aurochs @ Dec 27 2009, 15:52) *
Но вот поможет ли?

Ну, могу лишь сказать, что такой сброс у меня срабатывал в 100% случаев.
Go to the top of the page
 
+Quote Post

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

 


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


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