Embedded 如何调试看门狗超时

Embedded 如何调试看门狗超时,embedded,debugging,watchdog,Embedded,Debugging,Watchdog,我的微控制器中有一个看门狗,如果它没有被踢,它将重置处理器。我的应用程序可以正常运行一段时间,但最终会重置,因为看门狗没有被踢。如果我一步一步地完成这个程序,效果会很好 有哪些调试方法 编辑: 结论: 我发现我的虫子的方法是看门狗面包屑 我使用的PIC具有高ISR向量和低ISR向量。假设高矢量处理LED矩阵,低矢量处理计时器滴答声。但我将两个ISR处理程序都放在高向量中。因此,当我禁用LED矩阵ISR和定时器滴答声ISR所需服务时,处理器将卡在低ISR以处理定时器滴答声,但定时器滴答声处理程序不

我的微控制器中有一个看门狗,如果它没有被踢,它将重置处理器。我的应用程序可以正常运行一段时间,但最终会重置,因为看门狗没有被踢。如果我一步一步地完成这个程序,效果会很好

有哪些调试方法

编辑: 结论: 我发现我的虫子的方法是看门狗面包屑

我使用的PIC具有高ISR向量和低ISR向量。假设高矢量处理LED矩阵,低矢量处理计时器滴答声。但我将两个ISR处理程序都放在高向量中。因此,当我禁用LED矩阵ISR和定时器滴答声ISR所需服务时,处理器将卡在低ISR以处理定时器滴答声,但定时器滴答声处理程序不在那里


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

对您的每个假设提出两次问题:

  • 确保看门狗被踢(我不知道处理器上的日志记录设施)
  • 确保看门狗在被踢时不会重置处理器

想知道"走过去"和单独跑有什么区别,;定时约束肯定很重要。

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

在main的开头放置一个断点


处理器复位时,全局变量仍将具有上次设置的值。继续添加这些“面包屑”以缩小问题函数的范围。

当您连接调试器时,许多软件监视程序会自动禁用(以防止调试器在应用程序停止时重新启动)

也就是说,以下是一些基本知识:

这是一个多线程应用程序吗?您正在使用RT调度程序吗?如果是这样,您的看门狗任务是否已耗尽

确保你的看门狗任务不会停留在任何事情上(挂起的信号量、等待消息等)。有时,函数会以您可能无法预料的方式阻塞;例如,我现在正在开发一个Linux平台,在那里我可以很容易地阻止printf

如果是单线程的,探查器可以帮助您确定时间问题


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

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


祝你好运,这听起来像是个时间问题,很难解决

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


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

我将使用一个额外的输出引脚,在代码中的适当点设置为高,然后设置为低,以限制我查看的范围。然后我会在数字示波器或逻辑分析仪上跟踪它。这相当于另一张海报中提到的面包屑方法,但您将能够更好地与重置脉冲进行时间关联。

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

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

第二页!:)每当新的仿真板到达调试,我要确保的第一件事是WD单元被切断!只是想补充一点:一个“未初始化的全局变量”在C编译器中需要一些特殊的语义。该标准规定,即使是未赋值的全局变量也必须初始化为零。因此,通常需要这些变量的属性,例如avr gcc的“.noinit”。