Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Watchdog @ SAM7X вешает AIC ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
_dem
Ситуация такая :

Есть проект, на стадии конечной отладки. Все вроде проверено, оттестировано и работает. Но вот после очередной версии FW от тестеров стали приходить жалобы - платы самопроизвольно перезагружаются.
Разбор полетов и воспроизведение условий показало, что проблема в следующем :

Включение watchdog в прошивке приводит к тому, что под воздействием "DOS-атаки" UDP пакетами по ethernet плата через некоторое время (10-50 секунд) после старта перегружается по WD.

Atmel AT91SAM7X, PHY : RTL8201BL, micrium OS ( OS_VERSION = 283u ), IAR 4.41
tcp/ip стек от микриума.

Работа с WD организована следующим образом - в системном обработчике IdleTaskHook (Idle task имеет самый низкий приоритет) проверяется время, прошедшее с предыдущего сброса WD таймера. Если прошло более половины периода WD, он сбрасывается.

Код :

Код
    
void WD_Init( unsigned short period, unsigned char createTimer )
{
// enable clock
    AT91C_BASE_PMC->PMC_PCER   = (1 << AT91C_ID_SYS);                  

    if (!period)
    {
        AT91C_BASE_WDTC->WDTC_WDMR =  AT91C_WDTC_WDDIS;
        return;
    }
    
    // first, creating OS timer    
    if (createTimer)
    {
    unsigned char err;
    OS_TMR * WDTimer = OSTmrCreate(period / 3, period / 3, OS_TMR_OPT_PERIODIC, (OS_TMR_CALLBACK)WD_TimerCallback, 0, "Watchdog timer", &err );
    
    if ( (!period) || (err != OS_NO_ERR) || (!OSTmrStart( WDTimer, &err)) || (err != OS_NO_ERR) )
    {
         // disabling WD, we can't start timer
        AT91C_BASE_WDTC->WDTC_WDMR =  AT91C_WDTC_WDDIS;
        return;
    }
    }
    
    // timer started, configure WD
    // AT91C_BASE_WDTC->WDTC_WDCR
    __wd_period = period / 2;
    __wd_timestamp = OSTimeGet();
    
    period = period / 4;         // 4 msec per WD tick
    period = (period & 0x0FFF); // cut to 12 bit
                                      
    //AT91C_BASE_WDTC->WDTC_WDMR = ( AT91C_WDTC_WDDBGHLT | AT91C_WDTC_WDIDLEHLT | AT91C_WDTC_WDRSTEN | AT91C_WDTC_WDRPROC | (( period / 4 * 3) << 16) | (period) );
    AT91C_BASE_WDTC->WDTC_WDMR = ( AT91C_WDTC_WDDBGHLT | AT91C_WDTC_WDIDLEHLT | AT91C_WDTC_WDFIEN | (( period / 4 * 3) << 16) | (period) );
    // register IRQ handler
    BSP_Set_WDIRQHandler( __WD_IRQ_Handler );
}


Процедура, которая сбрасывает таймер :

Код
void WD_Tick( void )
{
    if (!__wd_period)
            return;
    if ( (OSTime - __wd_timestamp) > __wd_period)
    {
        AT91C_BASE_WDTC->WDTC_WDCR = 0xA5000001;
        __wd_timestamp = OSTime;
    }
}


Происходит интересная вещь - на каком-то этапе перестает работать AIC. Прерывания генерируются, но системный обработчик не запускается (используется protected mode), срабатывает он только от Watchdog.

зы. Грешил на приоритеты прерываний (думал, зависаю где-то в обработчике) - но только отключение собаки решило проблему.

Буду признателен beer.gif за любую информацию, кто работал с собакой на этом процессоре.
meister
Цитата(_dem @ Jan 24 2008, 18:09) *
Работа с WD организована следующим образом - в системном обработчике IdleTaskHook (Idle task имеет самый низкий приоритет) проверяется время, прошедшее с предыдущего сброса WD таймера. Если прошло более половины периода WD, он сбрасывается.


Зачем проверять? Я просто сбрасываю и все :)

Код
extern "C" void vApplicationIdleHook(void)
{
    hw::cpu_load_idle();
    hw::watchdog_notify();
    hw::power_off();
}

namespace hw
{
        inline void watchdog_notify(void)
        {
            FIO0PIN ^= BIT_(PIN_WDI_PORT0);
        }
}


Цитата(_dem @ Jan 24 2008, 18:09) *
Буду признателен beer.gif за любую информацию, кто работал с собакой на этом процессоре.


У меня другой, но я, обычно, пробую просто работу аппаратуры саму по себе. То есть что собака сбрасывает проц, если ее не дергать (вместе с тем, как часто это происходит) и что не сбрасывает, если ее дергать. Просто собака сама по себе у Вас работает?

Цитата(_dem @ Jan 24 2008, 18:09) *
Включение watchdog в прошивке приводит к тому, что под воздействием "DOS-атаки" UDP пакетами по ethernet плата через некоторое время (10-50 секунд) после старта перегружается по WD.


Можно в обработчике сброса собаки мигать светодиодом и дергать ногой процессора и судить о том, сбрасывается вообще он или нет. Может, когда плату ДОСят она и не заходит в idle так часто, как надо.
etoja
WDT у Атмела вешает процессор. Это признано в эррате.
SpiritDance
Цитата(etoja @ Jan 25 2008, 10:19) *
WDT у Атмела вешает процессор. Это признано в эррате.

Во-первых это касается только SAM7S256 и SAM7S128.
Во-вторых в ревизии B этих чипов все поправлено.
В-третьих есть workaround.
Не вводите в заблуждение.
_dem
У меня X256, ревизия A. Сейчас попробую решение, описанное в эррате - может, мне не повезло sad.gif

В IDLE таск я сбрасываю собаку, в таске ровно на 1-цу приоритетнее - мигаю диодом. Собака сама по себе работает, т.е. если по команде снаружи сделать while(1) {}, то проц сбрасывается и даже красиво оставляет лог сброса (id и имя зависшего таска, время сброса)

в момент сбоя AIC перестает обрабатывать прерывания. Единственное, что срабатывает - прерывание собаки.

ps. У меня AT91C_WDTC_WDRSTEN = 0, errata "не про нас"

=== UPDATE ===

Убрал в настройке собаки "окно срабатывания" (минимальный интервал сброса) -

т.е. вместо
AT91C_BASE_WDTC->WDTC_WDMR = ( AT91C_WDTC_WDDBGHLT | AT91C_WDTC_WDIDLEHLT | AT91C_WDTC_WDFIEN | (( period / 4 * 3) << 16) | (period) );

сделал

AT91C_BASE_WDTC->WDTC_WDMR = ( AT91C_WDTC_WDDBGHLT | AT91C_WDTC_WDIDLEHLT | AT91C_WDTC_WDFIEN | ( period) << 16) | (period) );

пока работает ( во всяком случае, ранее валилось на первых секундах, сейчас уже две минуты под тестом живетЪ

Имейте в виду на будущее smile.gif
SpiritDance
Цитата(_dem @ Jan 25 2008, 13:52) *
У меня X256, ревизия A.

ps. У меня AT91C_WDTC_WDRSTEN = 0, errata "не про нас"

Еще раз. Ошибка только в чипах серии S!
_dem
Цитата
Еще раз. Ошибка только в чипах серии S!

да я на всяк случай проверял smile.gif

Так, дополнение :
Лежат на столе две платы, на одной все работает отлично, вторая глючит вышеописанным способом. Аппаратка одинаковая, прошивка одинаковая. Платы уже и прогрели, и выводы пропаяли... sad.gif

Пока не отключил минимальный интервал сброса, так и работало через Ж.

В целом - в стойке (12 плат) после запуска теста вылетало 8, оставшиеся стабильно работали.

Есть другие идеи, кроме бага в собаке ?
SpiritDance
Ошибка в ДНК? smile.gif)
_dem
Цитата
Ошибка в ДНК? )

smile.gif
Аха smile.gif или в радиусе кривизны smile.gif

----
Слишком рано собаку дергать не мог, т.к. по индикации отчетливо видно - умерла плата, перестали идти пакеты, потом через пару секунд сброс собакой...
etoja
Вы ошиблись в том, что выбрали Atmel.
_dem
К сожалению, чипы других производителей с нужной производительностью/функционалом у нас практически не доставабельны, причем независимо от объема заказа sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.