假设我在嵌入式环境中有一个协作调度程序。我有很多进程在运行。我想利用看门狗定时器,这样我就可以检测进程何时因任何原因停止运行并重置处理器。
在没有rto的简单应用程序中,我总是从主循环中触摸看门狗,这总是足够的。然而,这里有许多进程可能会挂起。在确保每个进程处于良好状态的同时,定期触摸看门狗计时器的干净方法是什么?
我想我可以为每个进程提供一个回调函数,这样它就可以让另一个监视所有进程的函数知道它还活着。回调将传递一个参数,该参数将是任务唯一id,以便监管者可以确定是谁在回调。
最佳答案
一种常见的方法是将监视程序委托给特定任务(通常是最高优先级或最低优先级,每种方法的折衷/动机),然后让所有其他任务“签入”此任务。
这种方式:
如果中断被挂起(100%CPU),则kicker任务将不会运行,您将重置
如果Kicker任务挂起,则重置
如果另一个任务挂起,kicker task看不到签入,kicker task不踢wdg,则重置
现在当然有实施细节要考虑。有些人让每个任务在全局变量中设置自己的专用位(原子的);kicker任务以特定的速率检查这组位标志,并在每个人都签入时清除/重置(当然还有踢wdg)。我避开像瘟疫这样的全局变量,避免这种方法。rtos事件标志提供了一种更优雅的类似机制。
我通常将我的嵌入式系统设计为事件驱动系统。在这种情况下,每个任务在消息队列的一个特定位置阻塞。所有任务(和ISR)通过发送事件/消息相互通信。这样,您就不必担心任务没有签入,因为它被“那边”的信号灯阻塞了(如果这没有意义,对不起,如果不写更多的话,我无法更好地解释)。
此外,还有考虑事项-是否“自主”签入任务,或是否答复/响应来自Kicker任务的请求。自治-例如,每秒一次,每个任务在其队列中接收一个事件“告诉Kicker任务你还活着”。回复请求-每秒一次(或其他什么),kicker任务告诉每个人(通过队列)“签入时间”-最终每个任务运行其队列,获取请求和回复。考虑任务优先级、排队理论等。
有100种方法可以剥下这只猫的皮,但是一个任务的基本原则是负责踢出WDG,并让其他任务漏斗到踢出任务是相当标准的。
至少还有一个方面需要考虑——在这个问题的范围之外——那就是处理中断。如果一个isr占用cpu(很好),我上面描述的方法将触发wdg重置,但是相反的情况呢-一个isr(很不幸)意外地被意外地禁用了。在许多情况下,这不会被捕获,并且您的系统仍然会启动WDG,但您的系统的一部分是残废的。有趣的东西,这就是为什么我喜欢嵌入式开发。
关于c - 如何在RTOS中使用看门狗定时器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13217959/