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

如何确定哪个任务已死亡?

  •  2
  • Robert Deml  · 技术社区  · 17 年前

    我不能仅仅责怪最老的任务去踢看门狗,因为它可能被一个不让步的更高优先级的任务拖延了。

    有什么建议吗?

    7 回复  |  直到 17 年前
        1
  •  2
  •   paxdiablo    17 年前

    这是先发制人的吗?我想是这样的,因为如果其他人中的一个被卡住了,那么看门狗任务就不会运行。

    您没有提到操作系统,但是,如果看门狗任务可以检查单个任务是否未签入,则它们之间必须有单独的通信通道 每个

    和 转储任务控制块和内存,以便进行事后检查。

    根据操作系统的不同,这可能是容易的,也可能是困难的。

        2
  •  2
  •   Dingo    17 年前

        3
  •  1
  •   Chintan Parikh    17 年前

    就连我最近几周也在研究看门狗重置问题。但对我来说幸运的是,在ramdump文件(在ARM开发环境中)中,它有一个中断处理程序跟踪缓冲区,在每个中断处都包含PC和SLR。因此,从跟踪缓冲区中,我可以准确地找出WD重置之前运行的代码的哪一部分。

    我认为,若你们有同样的机制,在每次中断时存储PC、SLR,那个么你们就可以精确地找出罪魁祸首。

        4
  •  0
  •   simon    17 年前

    根据您的系统和操作系统,可能有不同的方法。我使用的一种非常低级的方法是在每个任务运行时使LED闪烁。您可能需要在LED上放置一个范围,以查看非常快速的任务切换。

        5
  •  0
  •   Mark    17 年前

    对于中断驱动的看门狗,您只需让任务切换器在每次更改时更新当前正在运行的任务编号,这样您就可以确定哪一个任务没有生成。

    但是,您建议您自己将watchdog编写为一个任务,因此在重新启动之前,watchdog肯定可以识别饥饿的任务吗?您可以将其存储在热重启后仍然存在的内存中,或者通过调试接口发送。这样做的问题是,饥饿任务可能不是有问题的任务:您可能想知道最后几个任务切换(和时间),以便确定原因。

        6
  •  0
  •   Benoit    17 年前

    int8_t wd_tickle[NUM_TASKS]
    
    void taskA_main()
    {
       ...
       // main loop
       while(1) {
         ...
         wd_tickle[TASKA_NUM]++;
       }
    }
    
    ... tasks B, C, D... follow similar pattern
    
    void watchdog_task()
    {
       for(int i= 0; i < NUM_TASKS; i++) {
         if(0 == wd_tickle[i]) {
           // Egads! The task didn't kick us! Reset and record the task number
         }
        }
    }
    
        7
  •  0
  •   Ron    17 年前

    你的系统到底是如何工作的?我总是同时使用软件和硬件看门狗。让我解释一下。。。

    我的示例假设您使用的是抢占式实时内核,并且您的cpu/微控制器中有看门狗支持。如果在特定时间段内未踢出,该看门狗将执行重置。您需要检查两件事:

    2) 所有线程都可以在合理的时间段内运行。

    我的RTOS(www.lieron.be/micror2k)提供了在RTOS时钟中断处理程序中运行代码的可能性。这是您刷新硬件看门狗的唯一地方,因此您可以确保时钟一直在运行(如果没有,看门狗将重置您的系统)。

    在空闲线程(总是以最低优先级运行)中,“软件看门狗”被刷新。这只是将变量设置为特定值(例如1000)。在RTOS时钟中断(触发硬件看门狗)中,减小并检查该值。如果达到0,则意味着空闲线程在1000个时钟周期内未运行,您将重新启动系统(可以通过在中断处理程序中无限期循环以让硬件看门狗重新启动来完成)。

    推荐文章