0

我目前正在使用 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

我在这里做错了吗?

4

0 回答 0