基于VxWorks操作系統的通用定時(shí)器設計
摘要 VxWorks操作系統以其強實(shí)時(shí)性、可剪裁性等特點(diǎn)得到了廣泛應用,但其并未提供通用的定時(shí)器模塊。為解決某機載發(fā)射裝置控制盒中VxWorks系統的精確定時(shí)問(wèn)題,文中在分析多種定時(shí)方式的基礎上,利用輔助時(shí)鐘中斷,通過(guò)創(chuàng )建定時(shí)節點(diǎn),構造節點(diǎn)鏈表,設計了基于輔助時(shí)鐘的通用定時(shí)器模塊。經(jīng)測試表明,該模塊實(shí)現了毫秒級定時(shí),滿(mǎn)足了某發(fā)射裝置的定時(shí)需求,并為今后類(lèi)似系統的精確定時(shí)需求提供了方便。
本文引用地址:http://dyxdggzs.com/article/246739.htm當前,無(wú)人機技術(shù)發(fā)展迅猛。為滿(mǎn)足我國察打一體無(wú)人機的裝備需求,基于現有小型制導武器和無(wú)人機平臺進(jìn)行集成,填補該領(lǐng)域空白。在某型空地制導武器和某型無(wú)人機的集成中,由于二者具有不同的數字通訊方式和電氣接口等,需在機載發(fā)射裝置中加裝控制盒,以滿(mǎn)足飛機與武器的交聯(lián)需求。該控制盒采用VxWorks操作系統設計軟件,具有實(shí)時(shí)性強、穩定性高等特點(diǎn)。
VxWorks操作系統自1987年由美國風(fēng)河公司成功推出以來(lái),已被廣泛應用于通信、軍事、航空、航天等高精尖及實(shí)時(shí)性要求較高領(lǐng)域。
1 VxWorks幾種常用的定時(shí)方式
在實(shí)時(shí)性要求高的應用系統中,定時(shí)器經(jīng)常會(huì )被用到。VxWorks提供了多樣的定時(shí)器接口函數,但沒(méi)有通用定時(shí)器。在VxWorks提供的定時(shí)器接口函數中,taskDelay()、WatchDog和sleep/nanosleep都以tick為基準,定時(shí)誤差較大,無(wú)法滿(mǎn)足高精度的定時(shí)要求,若把系統cloc krate(默認為60)提高,系統會(huì )被頻繁的時(shí)鐘中斷打斷,效率降低。另外,時(shí)間戳sysTimeStamp()雖可實(shí)現高精度定時(shí),但該定時(shí)方式較占用系統資源,只適合短時(shí)間定時(shí)。
輔助時(shí)鐘是利用目標板CPU內除系統時(shí)鐘外的另一個(gè)定時(shí)器中斷實(shí)現,VxWorks提供了一系列與系統時(shí)鐘相同的操作接口,可以通過(guò)掛接用戶(hù)自己中斷服務(wù)程序的方式實(shí)現精確延時(shí),當輔助時(shí)鐘的定時(shí)周期到時(shí),即觸發(fā)中斷服務(wù)程序。本文針對多任務(wù)長(cháng)時(shí)間工作的高精度定時(shí)需求提出了基于輔助時(shí)鐘的通用定時(shí)器機制。
2 基于輔助時(shí)鐘的定時(shí)機制設計
2.1 輔助時(shí)鐘的使用
在VxWorks下要利用輔助時(shí)鐘,首先要對輔助時(shí)鐘的使用進(jìn)行配置,以確保輔助時(shí)鐘可以被正常使用,然后分別調sysAuxClkConnect()函數將中斷服務(wù)程序與輔助時(shí)鐘中斷掛接、sysAuxClkRate()函數設置輔助時(shí)鐘中斷周期、sysAuxClkEnable()/sysAuxClkDisable()函數允許和禁止輔助時(shí)鐘。
通過(guò)對輔助時(shí)鐘的使用方式進(jìn)行研究發(fā)現,如果能在與輔助時(shí)鐘中斷掛接的中斷服務(wù)程序中對定時(shí)節點(diǎn)的剩余時(shí)間進(jìn)行更新,當節點(diǎn)剩余時(shí)間變?yōu)?則說(shuō)明該節點(diǎn)定時(shí)時(shí)間到,此時(shí)進(jìn)行相應的操作,從而達到精確定時(shí)的目的??赏ㄟ^(guò)同步信號量來(lái)調用定時(shí)節點(diǎn)處理任務(wù)來(lái)處理已經(jīng)定時(shí)到的節點(diǎn)。以下是輔助時(shí)鐘使用的基本原理

由此可看出,通過(guò)中斷服務(wù)程序,將輔助時(shí)鐘與定時(shí)任務(wù)聯(lián)系起來(lái),為精確定時(shí)提供了可能。
2.2 定時(shí)節點(diǎn)鏈表的創(chuàng )建
根據上述特點(diǎn),可將所有的定時(shí)任務(wù)通過(guò)一個(gè)定時(shí)任務(wù)鏈表與基于輔助時(shí)鐘設置的定時(shí)器關(guān)聯(lián)起來(lái),每當程序應用層添加一個(gè)定時(shí)任務(wù),就往該定時(shí)任務(wù)鏈表添加一個(gè)定時(shí)任務(wù)節點(diǎn)。通常的添加方法是,插入時(shí)從鏈表頭節點(diǎn)開(kāi)始遍歷,根據各個(gè)節點(diǎn)的剩余時(shí)間來(lái)確定插入位置,即將所要插入的定時(shí)任務(wù)節點(diǎn)按照相對其前一節點(diǎn)剩余時(shí)間的差由小到大排列。這樣,當輔助時(shí)鐘中斷到來(lái)時(shí)只需對定時(shí)任務(wù)鏈表中的第一個(gè)節點(diǎn)剩余時(shí)間進(jìn)行修改即可,而不必對整個(gè)鏈表進(jìn)行遍歷,從而減小了對實(shí)時(shí)性的影響。
假設系統中存在A(yíng)、B、C三個(gè)定時(shí)任務(wù),分別提交了定時(shí)周期為20 ms、40 ms和25 ms的定時(shí)任務(wù),任務(wù)間提交的時(shí)間間隔為2 ms,則定時(shí)任務(wù)鏈表節點(diǎn)的插入和排列情況如圖1所示。其中,第一步插入后,鏈表中為A任務(wù)的20 ms定時(shí)節點(diǎn);第二步插入為第一步操作2 ms后,此時(shí)鏈表中A節點(diǎn)的剩余時(shí)間變?yōu)?8 ms,而新插入B任務(wù)的定時(shí)周期為4 0ms,大于A(yíng)節點(diǎn)剩余時(shí)間,故插入鏈表后B任務(wù)剩余時(shí)間變?yōu)?2 ms;同理,2 ms后第三步新插入C任務(wù)的25 ms定時(shí)節點(diǎn)剩余時(shí)間變?yōu)? ms,B任務(wù)剩余時(shí)間變?yōu)?3 ms。

2.3 定時(shí)器實(shí)現
定時(shí)任務(wù)鏈表中的每個(gè)節點(diǎn)都對應一個(gè)定時(shí)任務(wù),其結構如下

通用定時(shí)器的實(shí)現主要提供了以下4個(gè)函數接口供應用層使用,以及一個(gè)系統中斷程序和一個(gè)自動(dòng)加載并啟動(dòng)的任務(wù)。
未找到引用源。定時(shí)模塊初始化函數ComTimerInit(int precision)定時(shí)模塊初始化函數主要用來(lái)初始化定時(shí)節點(diǎn)鏈表、創(chuàng )建信號量、設置輔助時(shí)鐘、創(chuàng )建定時(shí)中斷處理任務(wù),其中參數precision為定時(shí)器的分辨率,最小為1 ms。
定時(shí)節點(diǎn)添加函數int TimerIncrease(int val,void*pFunc,void*arg,SEM_ID sem)主要用于設置定時(shí)器。該函數首先從定時(shí)節點(diǎn)鏈表中獲取一個(gè)空閑節點(diǎn),然后根據要添加的定時(shí)節點(diǎn)參數初始化該節點(diǎn),最后將該節點(diǎn)重新添加到鏈表中。其中,函數參數val為所要定時(shí)的時(shí)間,pFunc為定時(shí)到之后要執行的函數,arg為pFunc的參數,sem為定時(shí)時(shí)間到后要釋放的信號量,函數返回值為定時(shí)節點(diǎn)的ID號。需要注意的是,當節點(diǎn)鏈表不為空時(shí)要開(kāi)啟輔助時(shí)鐘。
定時(shí)節點(diǎn)刪除函數TimerCanele(int ID)主要用于取消一個(gè)激活的定時(shí)節點(diǎn),該函數的傳輸參數為要取消的定時(shí)節點(diǎn)ID。
定時(shí)模塊銷(xiāo)毀函數ComTimerDes()主要用于從系統中銷(xiāo)毀定時(shí)模塊,包括刪除信號量、釋放鏈表內存。
輔助時(shí)鐘中斷服務(wù)程序AuxClkSvr()是實(shí)現精確定時(shí)的基礎,其通過(guò)函數sysAuxClkConnect()連接到輔助時(shí)鐘中斷上。為保證定時(shí)精確性,應使此中斷程序最短執行。為此建立有序的定時(shí)節點(diǎn)鏈表,每次中斷時(shí)只需從鏈表節點(diǎn)首開(kāi)始遍歷找到第一個(gè)未休眠的節點(diǎn),然后將該節點(diǎn)的timeLeft減1,若此時(shí)timeLeft為0,則釋放中斷處理任務(wù)的同步信號量;另外,為使得輔助時(shí)鐘的中斷次數最小,可將輔助時(shí)鐘的分辨率precision設為所需定時(shí)任務(wù)定時(shí)時(shí)間的最大公約數,從而函數TimerIncrease()的參數val為所需定時(shí)時(shí)間與precision的倍數。此函數的執行過(guò)程如圖2。
評論