Component之WatchDog

WatchDog,看门狗,一种定时器。很多CPU都带有WatchDog功能,这种硬件的WatchDog可以在系统死掉时重启系统,让系统回到可以工作的状态。它并不能防止系统死掉,但是能够让系统起死回生,从而提高了系统的可用性。硬件WatchDog的局限性是只能在系统范围内生效,不能针对单个任务,某个任务死掉时,WatchDog没法知道。

VxWorks系统提供了一种软件的WatchDog定时器,工作原理是在系统时钟的ISR上关联一个C函数

要想使用这种WatchDog,需要先创建它。用完之后,可以删除它

在《Utility之内核对象的静态实例化》里提到过,WatchDog也可以静态实例化

创建WatchDog之后,就可以启动它了

wdStart()会将WatchDog放入系统Tick的工作队列里。当wdId的delay结束后,系统时钟的ISR就会调用pRoutine(parameter)。参数delay的单位是系统时钟的tick。系统时钟每秒的tick数,可以由sysClkRateGet()来获得。

WatchDog的大致工作机制如下

写一个最简单的例子:

跑一下

可以看到,WatchDog的执行是一次性的,即每调用一次wdStart(),其关联的C函数只执行一次。而通常情况下,定时机制都是周期执行的,那么代码可以这样来写

即每次WatchDog计时结束,就再次启动同一个WatchDog。这样就实现了周期调用logMsg()的功能

另外,在WatchDog计时结束之前,可以随时将其停下

如果使用wdStart()再次启动同一个WatchDog,就相遇于将其重置,让其重新开始计时,也就类似于硬件WatchDog的作用了

这个例子里,应用程序doMyApp()的执行时长num小于10秒时,它就会周期执行。一旦它的执行时长超过10秒钟,WatchDog就会被触发,在这个例子里,系统就会重启。例如在Shell里执行: sp test,20

可以看到,VxWorks的WatchDog比硬件的WatchDog更灵活,因为它超时后,不一定就是直接重启,可以自定义超时后的处理机制。

使用show()命令,可以看到WatchDog的状态

当它的Ticks Remaining到0后,Routine就被执行了

因为WatchDog关联的这个C函数是在ISR里执行的,所以它不能调用那些可能引起阻塞的机制,例如printf(),这也是为什么刚刚的例子里都是用的logMsg()。同样是这个原因,WatchDog里也不应该执行太多操作,因此用它来定时的话,一般是与任务来配合操作

这个例子里,myWd每秒释放一次信号量,doMyApp()就可以每秒执行一次,而其执行的应用不需要担心ISR的限制了,例如可以使用printf()

最后,WatchDog的数量也不要太多,虽然软件上没有限制,但硬件能力总是有上限的,如果系统时钟里包含了太多操作,对系统性能肯定有影响了

最后的最后,出道题吧

已知doMyApp(Tb)执行的时长为Tb,Tb<Ta。问test1()、test2()、test3()、test4()这4个测试用例中,doMyApp()的执行周期分别为多少

这正是:

看门狗,定时器,应用程序跑周期。

中断里面来执行,不能阻塞要注意。

原文发布于微信公众号 - 这里只有VxWorks(VxWorks567)

原文发表时间:2019-06-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券