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