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