如何调试看门狗超时

时间:2009-03-19 11:35:43

标签: embedded debugging watchdog

我的微控制器中有一个看门狗,如果它没有踢,会重置处理器。我的应用程序运行良好一段时间,但最终将重置,因为看门狗没有被踢。如果我单步执行该程序,它可以正常工作。

有哪些方法可以调试它?

编辑: 结论: 我发现我的错误的方式是看门狗面包屑。

我正在使用具有高和低ISR向量的PIC。高矢量用于处理LED矩阵,低矢量用于处理定时器滴答。但我把两个ISR处理程序放在高位向量中。因此,当我禁用LED矩阵ISR并且计时器滴答ISR需要服务时,处理器将卡在低ISR中以处理计时器滴答,但是计时器滴答处理程序不存在。

面包屑将我的搜索范围限制在处理LED矩阵的功能上,特别是禁用LED矩阵中断。

8 个答案:

答案 0 :(得分:9)

添加一个未初始化的全局变量,该变量在整个代码中设置为不同的值。具体来说,在主要函数调用之前和之后设置它。

在main的开头放一个断点。

当处理器重置时,全局变量仍将具有它设置的最后一个值。继续添加这些“面包屑”以缩小问题功能。

答案 1 :(得分:3)

附加调试器时会自动禁用许多软件看门狗(以防止在调试器暂停应用程序时重新启动它)。

那就是说,这里有一些基础知识:

这是一个多线程应用程序吗?你在使用RT调度程序吗?如果是这样,你的看门狗任务是否会饿死?

确保您的监视程序任务不会卡在任何内容上(等待信号量,等待消息等)。有时候,功能会以你可能没想到的方式阻塞;例如,我现在正在使用一个Linux平台,我可以很容易地将printf阻塞。

如果是单线程,则分析器可以帮助您识别时序问题。

如果这是一个新系统,请确保看门狗正常工作;测试只是命中WD然后在无限循环中睡眠的简单代码。

答案 2 :(得分:2)

我使用基于状态的编程,我一直想要的技巧是为二进制当前状态保留一个输出端口。然后连接一个逻辑分析仪,看看状态变化的时间。你可以在这里做类似的事情:执行Robert所说的并创建一个全局变量并在关键点更改其值 - 最好使用一个立即将端口值设置为当前状态的函数(即changeState(nextState);)更改当你输入踢狗的功能时,你可以在你离开这个功能之前将它改回到之前的状态。你应该能够看到它不被踢的功能,然后你可以处理它们。

祝你好运,这听起来像是一个时间问题而且难以解决。

答案 3 :(得分:1)

通常看门狗任务/线程以低优先级运行。因此,如果看门狗没有被踢,这应该是因为处理器忙于做其他事情 - 可能是它不应该做的事情。

在处理器重置之前,为每个任务/线程转储执行上下文(本地堆栈,调度状态等)非常有用。通过一点运气和工作,您将能够确定阻止看门狗任务开启计时器的原因。

答案 4 :(得分:1)

我会使用额外的输出引脚,在代码中的适当位置设置为高电平然后设置为低电平,以限制我正在寻找的范围。然后我会在数字示波器或逻辑分析仪上跟踪它。这相当于另一张海报提到的面包屑方法,但是你可以更好地与复位脉冲相关联。

答案 5 :(得分:0)

质疑你做出的每一个假设,两次:

  • 确保看门狗踢了(我不知道处理器上的日志工具)。
  • 确保看门狗在被踢时不会重置处理器。

想知道“踩踏”和独自跑步之间存在什么差异;时间限制肯定会很重要。

答案 6 :(得分:0)

您可以在代码中插入while循环,并在while循环内切换LED。这是检查电路板是否正在重置的有效方法。

答案 7 :(得分:0)

您可以将 strace(选项 -p)附加到正在运行的进程,观察它何时停止写入打开 /dev/watchdog 的文件描述符。 您可以使用选项 strace 过滤 -e 输出。 有关详细信息,请参阅手册页。