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