VxWorks在內核中提供了看門狗機制,允許任何C函數以特定的延時掛接到一個定時器上。
看門狗定時器被作爲系統時鐘ISR的一部分而維持。由看門狗定時器觸發的函數,將作爲系統時鐘的中斷服務代碼而執行。如下函數由wdLib庫提供:
看門狗定時器示例
靜態實例化看門狗定時器
wdCreate()函數執行了一個動態的、兩步的操作,可以在運行時爲看門狗定時器分配內存,並初始化看門狗定時器對象。看門狗定時器(包括其他VxWorks對象)也可以靜態實例化(意味着在編譯時爲對象分配內存),然後在運行時初始化。
宏VX_WDG在編譯時聲明一個看門狗定時器,僅需要一個看門狗定時器名作爲參數。函數wdInitialize()用於在運行時初始化看門狗定時器並將其使能。宏與函數必須使用同一個看門狗定時器名稱。
靜態實例化看門狗示例
使用公共看門狗定時器進行進程間通信
VxWorks看門狗定時器可以作爲私有對象創建,也可以作爲公共對象創建。如果創建爲公共對象,那麼在系統全局都可以進行訪問。
問題:如何使用看門狗定時器週期性地執行一個特定的函數myFun()?
方法:僅需要在myFun()函數中遞歸地調用wdStart()函數,其中又將myFun()函數作爲參數傳入wdStart()中。需要注意遞歸退出條件的設置。示例僞代碼如下:
int myFun(){
if(condition is true){
return 0; //跳出遞歸調用
}
wdStart(...,myFun(),...); //在看門狗中掛接myFun()以週期執行該函數
return 0;
}