Получить указатель стека и адрес возврата для 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
Я что-то здесь не так делаю?