VxWorks下的異步通用定時器設(shè)計
使用C++標準模板庫中的map實現(xiàn)對定時器的存儲。第1個參數(shù)為定時器的索引號,第2個參數(shù)為定時器控制結(jié)構(gòu)。使用map可以方便地實現(xiàn)基于定時器索引號的存儲管理和索引號的查找。使用map的定時器存儲示意圖如圖1所示。本文引用地址:http://cafeforensic.com/article/163412.htm
用戶在調(diào)用SetTimer函數(shù)時,創(chuàng)建一個初始狀態(tài)為空的計數(shù)信號量timerArrv,同時生成一個任務(wù)timerTask等待該信號量,此時任務(wù)狀態(tài)為PEND;實例化一個CClk-Generator對象,創(chuàng)建看門狗啟動定時器。當(dāng)定時器超時時,釋放timerArrv信號量,解除阻塞在timerArrv上的任務(wù),回調(diào)用戶函數(shù)完成一個完整的定時過程。定時器的典型運行過程如圖2所示。
圖2中最底下的虛線指向啟動看門狗后的中斷處理流程。中間部分表示定時器任務(wù)運行過程,可見用戶回調(diào)函數(shù)是運行在任務(wù)空間中?!盎卣{(diào)函數(shù)釋放信號量”到定時器任務(wù)semTake”的虛線表示釋放信號量使任務(wù)解鎖。
4 定時器的應(yīng)用
定時器管理控制模塊是用戶的唯一接口,使用Single-ton模式。只要調(diào)用CTimerCtrl::GetTimerCtrl()就可以完成對異步通用定時器的初始化,除對定時器進行相關(guān)操作之外,還包括通過sysClkRateSet函數(shù)設(shè)置系統(tǒng)時鐘每秒的tick數(shù)為1000。下面的例子包含2個定時器:一個是1 sN期性定時器;另一個是周期為5 s的一次性定時器。
結(jié) 語
從應(yīng)用實例中可以看出,異步通用定時器的使用方法和Windows下的定時器沒有太大區(qū)別,接口簡單清晰。異步通用定時器可以應(yīng)用于定時精度為ms的絕大部分應(yīng)用程序中,對于精度要求高于ms的定時使用硬件輔助時鐘中斷更為合適,但是要注意操作系統(tǒng)對中斷處理函數(shù)的限制。
評論