Получить указатель стека и адрес возврата для sam3x8E

В настоящее время я работаю над проектом с использованием Arduino Due (Atmel SAM3X8E), который случайно сбрасывает сторожевой таймер. (иногда он сбрасывается через 10 минут, иногда он работает часами, а затем сбрасывает сторожевой таймер). Тайм-аут моего сторожевого таймера установлен довольно долго (7 секунд)

Проект вырос довольно большой, и у меня нет отладчика (также нет отладчика для кода Arduino)

И, к сожалению, я понятия не имею, где можно хранить программу.

Что бы вы, ребята, предложили сделать в этой ситуации?

Заранее спасибо.

==================== Обновление 01:======================

Теперь я собираюсь использовать прерывание сторожевого таймера, чтобы дать мне больше информации, когда сторожевой таймер запускается. Я провел небольшое исследование в Интернете и написал следующий код для установки. Но это не работает...

Я ожидаю, что когда я создаю while(1){}, будет активирован сторожевой таймер, и через WDT_handler() я смогу получить некоторое сообщение об отладке, которое позже я могу добавить, возможно, более полезную информацию об отладке. Но в реальном случае. Я не получил никакого сообщения, поэтому я предполагаю, что WDT_handler не был выполнен вообще.

Может кто-нибудь взглянуть и помочь мне выяснить, в чем проблема?

настройка сторожевого таймера:

inline static void startWatchdog() 
{
    //WDT_Enable(WDT, WDT_MR_WDRSTEN | WATCHDOG_INTERVAL );
    uint32_t timeout = 8000 * 256 / 1000; //8000ms = 8s
    if (timeout == 0) timeout = 1;
    else if (timeout > 0xFFF) timeout = 0xFFF;
    timeout = WDT_MR_WDRSTEN | WDT_MR_WDV(timeout) | 
    WDT_MR_WDD(timeout)|WDT_MR_WDFIEN;

    WDT_Enable (WDT, timeout);       

    /* Configure and enable WDT interrupt. */
    NVIC_DisableIRQ(WDT_IRQn);
    NVIC_ClearPendingIRQ(WDT_IRQn);
    NVIC_SetPriority(WDT_IRQn, 0);
    NVIC_EnableIRQ(WDT_IRQn);       
} 

И у меня есть сторожевой обработчик

void WDT_Handler(void) 
{
    /* Clear status bit to acknowledge interrupt by dummy read. */
    WDT_GetStatus(WDT);

    print("help! in WDT");
}

=========================== Обновление 02:==================== знак равно

Я узнал, где проблема! Если я хочу использовать обработчик прерываний, я не должен использовать WDT_MR_WDRSTEN. Это немедленно перезагрузит процессор, поэтому WDT_handler не запускается. (Похоже)

========== Обновление 03: ========================

Я попытался поймать адрес возврата из указателя стека внутри WDT_Handler. используя следующий код:

uint32_t returnAddr;
// IRQ handler for WDT
void WDT_Handler() 
{
    returnAddr = __get_MSP();
    Com::printFLN(PSTR("return addr: "),returnAddr);
}

Да, я получил номер: 0x20087F28. И я проверяю разборку моего проекта, используя arm-none-eabi-objdump.exe для декодирования моего.elf-файла. И я не смог найти ни одного адреса, который бы указывал на этот номер 0x20087F28

Я что-то здесь не так делаю?

0 ответов

Другие вопросы по тегам