Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7X256. Загадка для шпиона.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Aurochs
Имеется такой вот код (для 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
aaarrr
Отца русской демократии спасет чтение документации и отказ от идиотских функций AT91F_. Вы сбрасываете только процессор, вся периферия (в том числе и контроллер прерываний) продолжает как ни в чем не бывало работать.
Сбрасывайте все полностью:
Код
#define    at91_sw_reset()    {                                    \
    while(1)                                                \
        AT91C_BASE_RSTC->RSTC_RCR = (0xa5UL << 24) |        \
        AT91C_RSTC_PROCRST | AT91C_RSTC_PERRST;}
Aurochs
Спасибо за ответ 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) *
Сбрасывайте все полностью:

Спасибо, я воспользуюсь Вашим кодом. Сам как-то не догадался поместить сброс внутрь цикла. Да, абстрактно это будет несколько понадежней, чем у меня. Но вот поможет ли?
aaarrr
Цитата(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% случаев.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.