我目前正在使用 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
我在这里做错了吗?