基于VxWorks操作系統(tǒng)的通用定時(shí)器設(shè)計(jì)
摘要 VxWorks操作系統(tǒng)以其強(qiáng)實(shí)時(shí)性、可剪裁性等特點(diǎn)得到了廣泛應(yīng)用,但其并未提供通用的定時(shí)器模塊。為解決某機(jī)載發(fā)射裝置控制盒中VxWorks系統(tǒng)的精確定時(shí)問(wèn)題,文中在分析多種定時(shí)方式的基礎(chǔ)上,利用輔助時(shí)鐘中斷,通過(guò)創(chuàng)建定時(shí)節(jié)點(diǎn),構(gòu)造節(jié)點(diǎn)鏈表,設(shè)計(jì)了基于輔助時(shí)鐘的通用定時(shí)器模塊。經(jīng)測(cè)試表明,該模塊實(shí)現(xiàn)了毫秒級(jí)定時(shí),滿足了某發(fā)射裝置的定時(shí)需求,并為今后類似系統(tǒng)的精確定時(shí)需求提供了方便。
本文引用地址:http://cafeforensic.com/article/246739.htm當(dāng)前,無(wú)人機(jī)技術(shù)發(fā)展迅猛。為滿足我國(guó)察打一體無(wú)人機(jī)的裝備需求,基于現(xiàn)有小型制導(dǎo)武器和無(wú)人機(jī)平臺(tái)進(jìn)行集成,填補(bǔ)該領(lǐng)域空白。在某型空地制導(dǎo)武器和某型無(wú)人機(jī)的集成中,由于二者具有不同的數(shù)字通訊方式和電氣接口等,需在機(jī)載發(fā)射裝置中加裝控制盒,以滿足飛機(jī)與武器的交聯(lián)需求。該控制盒采用VxWorks操作系統(tǒng)設(shè)計(jì)軟件,具有實(shí)時(shí)性強(qiáng)、穩(wěn)定性高等特點(diǎn)。
VxWorks操作系統(tǒng)自1987年由美國(guó)風(fēng)河公司成功推出以來(lái),已被廣泛應(yīng)用于通信、軍事、航空、航天等高精尖及實(shí)時(shí)性要求較高領(lǐng)域。
1 VxWorks幾種常用的定時(shí)方式
在實(shí)時(shí)性要求高的應(yīng)用系統(tǒng)中,定時(shí)器經(jīng)常會(huì)被用到。VxWorks提供了多樣的定時(shí)器接口函數(shù),但沒(méi)有通用定時(shí)器。在VxWorks提供的定時(shí)器接口函數(shù)中,taskDelay()、WatchDog和sleep/nanosleep都以tick為基準(zhǔn),定時(shí)誤差較大,無(wú)法滿足高精度的定時(shí)要求,若把系統(tǒng)cloc krate(默認(rèn)為60)提高,系統(tǒng)會(huì)被頻繁的時(shí)鐘中斷打斷,效率降低。另外,時(shí)間戳sysTimeStamp()雖可實(shí)現(xiàn)高精度定時(shí),但該定時(shí)方式較占用系統(tǒng)資源,只適合短時(shí)間定時(shí)。
輔助時(shí)鐘是利用目標(biāo)板CPU內(nèi)除系統(tǒng)時(shí)鐘外的另一個(gè)定時(shí)器中斷實(shí)現(xiàn),VxWorks提供了一系列與系統(tǒng)時(shí)鐘相同的操作接口,可以通過(guò)掛接用戶自己中斷服務(wù)程序的方式實(shí)現(xiàn)精確延時(shí),當(dāng)輔助時(shí)鐘的定時(shí)周期到時(shí),即觸發(fā)中斷服務(wù)程序。本文針對(duì)多任務(wù)長(zhǎng)時(shí)間工作的高精度定時(shí)需求提出了基于輔助時(shí)鐘的通用定時(shí)器機(jī)制。
2 基于輔助時(shí)鐘的定時(shí)機(jī)制設(shè)計(jì)
2.1 輔助時(shí)鐘的使用
在VxWorks下要利用輔助時(shí)鐘,首先要對(duì)輔助時(shí)鐘的使用進(jìn)行配置,以確保輔助時(shí)鐘可以被正常使用,然后分別調(diào)sysAuxClkConnect()函數(shù)將中斷服務(wù)程序與輔助時(shí)鐘中斷掛接、sysAuxClkRate()函數(shù)設(shè)置輔助時(shí)鐘中斷周期、sysAuxClkEnable()/sysAuxClkDisable()函數(shù)允許和禁止輔助時(shí)鐘。
通過(guò)對(duì)輔助時(shí)鐘的使用方式進(jìn)行研究發(fā)現(xiàn),如果能在與輔助時(shí)鐘中斷掛接的中斷服務(wù)程序中對(duì)定時(shí)節(jié)點(diǎn)的剩余時(shí)間進(jìn)行更新,當(dāng)節(jié)點(diǎn)剩余時(shí)間變?yōu)?則說(shuō)明該節(jié)點(diǎn)定時(shí)時(shí)間到,此時(shí)進(jìn)行相應(yīng)的操作,從而達(dá)到精確定時(shí)的目的??赏ㄟ^(guò)同步信號(hào)量來(lái)調(diào)用定時(shí)節(jié)點(diǎn)處理任務(wù)來(lái)處理已經(jīng)定時(shí)到的節(jié)點(diǎn)。以下是輔助時(shí)鐘使用的基本原理
由此可看出,通過(guò)中斷服務(wù)程序,將輔助時(shí)鐘與定時(shí)任務(wù)聯(lián)系起來(lái),為精確定時(shí)提供了可能。
2.2 定時(shí)節(jié)點(diǎn)鏈表的創(chuàng)建
根據(jù)上述特點(diǎn),可將所有的定時(shí)任務(wù)通過(guò)一個(gè)定時(shí)任務(wù)鏈表與基于輔助時(shí)鐘設(shè)置的定時(shí)器關(guān)聯(lián)起來(lái),每當(dāng)程序應(yīng)用層添加一個(gè)定時(shí)任務(wù),就往該定時(shí)任務(wù)鏈表添加一個(gè)定時(shí)任務(wù)節(jié)點(diǎn)。通常的添加方法是,插入時(shí)從鏈表頭節(jié)點(diǎn)開(kāi)始遍歷,根據(jù)各個(gè)節(jié)點(diǎn)的剩余時(shí)間來(lái)確定插入位置,即將所要插入的定時(shí)任務(wù)節(jié)點(diǎn)按照相對(duì)其前一節(jié)點(diǎn)剩余時(shí)間的差由小到大排列。這樣,當(dāng)輔助時(shí)鐘中斷到來(lái)時(shí)只需對(duì)定時(shí)任務(wù)鏈表中的第一個(gè)節(jié)點(diǎn)剩余時(shí)間進(jìn)行修改即可,而不必對(duì)整個(gè)鏈表進(jìn)行遍歷,從而減小了對(duì)實(shí)時(shí)性的影響。
假設(shè)系統(tǒng)中存在A、B、C三個(gè)定時(shí)任務(wù),分別提交了定時(shí)周期為20 ms、40 ms和25 ms的定時(shí)任務(wù),任務(wù)間提交的時(shí)間間隔為2 ms,則定時(shí)任務(wù)鏈表節(jié)點(diǎn)的插入和排列情況如圖1所示。其中,第一步插入后,鏈表中為A任務(wù)的20 ms定時(shí)節(jié)點(diǎn);第二步插入為第一步操作2 ms后,此時(shí)鏈表中A節(jié)點(diǎn)的剩余時(shí)間變?yōu)?8 ms,而新插入B任務(wù)的定時(shí)周期為4 0ms,大于A節(jié)點(diǎn)剩余時(shí)間,故插入鏈表后B任務(wù)剩余時(shí)間變?yōu)?2 ms;同理,2 ms后第三步新插入C任務(wù)的25 ms定時(shí)節(jié)點(diǎn)剩余時(shí)間變?yōu)? ms,B任務(wù)剩余時(shí)間變?yōu)?3 ms。
2.3 定時(shí)器實(shí)現(xiàn)
定時(shí)任務(wù)鏈表中的每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一個(gè)定時(shí)任務(wù),其結(jié)構(gòu)如下
通用定時(shí)器的實(shí)現(xiàn)主要提供了以下4個(gè)函數(shù)接口供應(yīng)用層使用,以及一個(gè)系統(tǒng)中斷程序和一個(gè)自動(dòng)加載并啟動(dòng)的任務(wù)。
未找到引用源。定時(shí)模塊初始化函數(shù)ComTimerInit(int precision)定時(shí)模塊初始化函數(shù)主要用來(lái)初始化定時(shí)節(jié)點(diǎn)鏈表、創(chuàng)建信號(hào)量、設(shè)置輔助時(shí)鐘、創(chuàng)建定時(shí)中斷處理任務(wù),其中參數(shù)precision為定時(shí)器的分辨率,最小為1 ms。
定時(shí)節(jié)點(diǎn)添加函數(shù)int TimerIncrease(int val,void*pFunc,void*arg,SEM_ID sem)主要用于設(shè)置定時(shí)器。該函數(shù)首先從定時(shí)節(jié)點(diǎn)鏈表中獲取一個(gè)空閑節(jié)點(diǎn),然后根據(jù)要添加的定時(shí)節(jié)點(diǎn)參數(shù)初始化該節(jié)點(diǎn),最后將該節(jié)點(diǎn)重新添加到鏈表中。其中,函數(shù)參數(shù)val為所要定時(shí)的時(shí)間,pFunc為定時(shí)到之后要執(zhí)行的函數(shù),arg為pFunc的參數(shù),sem為定時(shí)時(shí)間到后要釋放的信號(hào)量,函數(shù)返回值為定時(shí)節(jié)點(diǎn)的ID號(hào)。需要注意的是,當(dāng)節(jié)點(diǎn)鏈表不為空時(shí)要開(kāi)啟輔助時(shí)鐘。
定時(shí)節(jié)點(diǎn)刪除函數(shù)TimerCanele(int ID)主要用于取消一個(gè)激活的定時(shí)節(jié)點(diǎn),該函數(shù)的傳輸參數(shù)為要取消的定時(shí)節(jié)點(diǎn)ID。
定時(shí)模塊銷毀函數(shù)ComTimerDes()主要用于從系統(tǒng)中銷毀定時(shí)模塊,包括刪除信號(hào)量、釋放鏈表內(nèi)存。
輔助時(shí)鐘中斷服務(wù)程序AuxClkSvr()是實(shí)現(xiàn)精確定時(shí)的基礎(chǔ),其通過(guò)函數(shù)sysAuxClkConnect()連接到輔助時(shí)鐘中斷上。為保證定時(shí)精確性,應(yīng)使此中斷程序最短執(zhí)行。為此建立有序的定時(shí)節(jié)點(diǎn)鏈表,每次中斷時(shí)只需從鏈表節(jié)點(diǎn)首開(kāi)始遍歷找到第一個(gè)未休眠的節(jié)點(diǎn),然后將該節(jié)點(diǎn)的timeLeft減1,若此時(shí)timeLeft為0,則釋放中斷處理任務(wù)的同步信號(hào)量;另外,為使得輔助時(shí)鐘的中斷次數(shù)最小,可將輔助時(shí)鐘的分辨率precision設(shè)為所需定時(shí)任務(wù)定時(shí)時(shí)間的最大公約數(shù),從而函數(shù)TimerIncrease()的參數(shù)val為所需定時(shí)時(shí)間與precision的倍數(shù)。此函數(shù)的執(zhí)行過(guò)程如圖2。
評(píng)論