代码之家  ›  专栏  ›  技术社区  ›  Robert Deml

如何调试看门狗超时

  •  10
  • Robert Deml  · 技术社区  · 15 年前

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

    有哪些调试方法?

    编辑: 结论:

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

    7 回复  |  直到 15 年前
        1
  •  10
  •   Robert Deml    15 年前

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

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

        2
  •  4
  •   Mikeage    15 年前

    附加调试器时,许多软件监视程序会自动禁用(以防止调试器停止应用程序时重新启动)。

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

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

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

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

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

        3
  •  2
  •   Stephen Friederichs    15 年前

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

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

        4
  •  2
  •   billmcc    15 年前

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

        5
  •  2
  •   Michael Kohne    15 年前

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

        6
  •  1
  •   shivakeerthan    8 年前

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

        7
  •  0
  •   xtofl Adam Rosenfield    15 年前

    对你所做的每一个假设提出两次问题:

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

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

        8
  •  0
  •   U. Windl    3 年前

    strace (选项 -p /dev/watchdog . 你可以过滤 斜射 输出使用选项 -e . 有关详细信息,请参阅手册页。