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

时间:2009-04-30 13:50:58

标签: debugging embedded watchdog

我有一个嵌入式系统,它有多个(> 20)任务以不同的优先级运行。我还有看门狗任务,用于检查所有其他任务是否卡住。我的看门狗正在工作,因为每次在蓝色的月亮中,它都会重新启动系统,因为任务没有登记。

如何确定哪个任务死亡?

我不能仅仅责怪最古老的任务,因为它可能被一个没有屈服的更高优先级的任务所阻止。

有什么建议吗?

7 个答案:

答案 0 :(得分:2)

每个任务的监视程序要求较高优先级的任务产生足够的时间,以便所有人都可以启动监视程序。要确定哪个任务有问题,您必须找到一个正在挨饿的任务。您需要在看门狗检查之间测量任务执行时间,以找出实际的罪魁祸首。

答案 1 :(得分:2)

即使我上周在看门狗重置问题上工作了。但幸运的是我在ramdump文件中(在ARM开发环境中),它有一个中断处理程序跟踪缓冲区,在每个中断包含PC和SLR。因此,从跟踪缓冲区,我可以准确地找出WD重置之前运行的代码部分。

我认为如果你有相同的存储PC机制,每次中断都有SLR,那么你就可以精确地找出罪魁祸首的任务。

答案 2 :(得分:1)

这是先发制人吗?我这样收集起来,否则如果其中一个人被卡住了,看门狗的任务将无法运行。

您没有提及操作系统,但是,如果监视程序任务可以检查单个任务是否未签入,则每个任务与监视程序之间必须有单独的通信通道。

您可能必须修改监视程序以某种方式转储未检入的任务编号和转储任务控制块和内存,以便您可以进行验证

根据操作系统的不同,这可能很容易或很难。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

对于中断驱动的看门狗,您只需让任务切换器在每次更改时更新当前运行的任务编号,以便您识别哪一个没有产生。

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

答案 5 :(得分:0)

一种简单的,背面的餐巾方法将是这样的:

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
     }
    }
}

答案 6 :(得分:0)

您的系统如何正常工作?我总是使用软件和硬件监视器的组合。让我解释一下......

我的示例假设您正在使用抢占式实时内核,并且您的cpu /微控制器中有看门狗支持。如果在一段时间内没有被踢,该看门狗将执行重置。你想检查两件事:

1)定期系统定时器(“RTOS时钟”)正在运行(如果没有,“睡眠”等功能将不再起作用且系统无法使用)。

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

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

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

现在提出原始问题。我假设系统时钟一直在运行,因此软件看门狗会重置系统。在RTOS时钟中断处理程序中,您可以执行一些“统计信息收集”以防软件看门狗情况发生。您可以在每个时钟周期(问题发生后)看到正在运行的线程,而不是重置系统,并尝试找出正在发生的事情。它并不理想,但它会有所帮助。

另一个选择是添加几个不同优先级的软件监视器。让空闲线程将VariableA设置为1000并且具有(专用)中等优先级线程集变量B.在RTOS时钟中断处理程序中,检查两个变量。有了这些信息,您就知道循环线程的优先级是“中”还是低于“中”。如果您希望可以添加第3或第4个或您喜欢的软件看门狗数量。最糟糕的情况是,为每个使用的优先级添加软件看门狗(虽然会花费你很多额外的线程)。