VxWorks在内核中提供了看门狗机制,允许任何C函数以特定的延时挂接到一个定时器上。

看门狗定时器被作为系统时钟ISR的一部分而维持。由看门狗定时器触发的函数,将作为系统时钟的中断服务代码而执行。如下函数由wdLib库提供:

VxWorks 7 Watch Dog

看门狗定时器示例

VxWorks 7 Watch Dog

静态实例化看门狗定时器

wdCreate()函数执行了一个动态的、两步的操作,可以在运行时为看门狗定时器分配内存,并初始化看门狗定时器对象。看门狗定时器(包括其他VxWorks对象)也可以静态实例化(意味着在编译时为对象分配内存),然后在运行时初始化。

宏VX_WDG在编译时声明一个看门狗定时器,仅需要一个看门狗定时器名作为参数。函数wdInitialize()用于在运行时初始化看门狗定时器并将其使能。宏与函数必须使用同一个看门狗定时器名称。

静态实例化看门狗示例

VxWorks 7 Watch Dog

使用公共看门狗定时器进行进程间通信

VxWorks看门狗定时器可以作为私有对象创建,也可以作为公共对象创建。如果创建为公共对象,那么在系统全局都可以进行访问。

问题:如何使用看门狗定时器周期性地执行一个特定的函数myFun()?

方法:

仅需要在myFun()函数中递归地调用wdStart()函数,其中又将myFun()函数作为参数传入wdStart()中。需要注意递归退出条件的设置。示例伪代码如下:


int myFun(){
    
    if(condition is true){
        return 0;                 //跳出递归调用
    }
 
    wdStart(...,myFun(),...);    //在看门狗中挂接myFun()以周期执行该函数
 
    return 0;
}