获取sam3x8E

时间:2017-08-28 18:04:04

标签: debugging arduino watchdog arduino-due atsam3x

我目前正在使用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 个答案:

没有答案