山 清
(中國(guó)空空導(dǎo)彈研究院12所,洛陽 471009)
當(dāng)前,無人機(jī)技術(shù)發(fā)展迅猛。為滿足我國(guó)察打一體無人機(jī)的裝備需求,基于現(xiàn)有小型制導(dǎo)武器和無人機(jī)平臺(tái)進(jìn)行集成,填補(bǔ)該領(lǐng)域空白。在某型空地制導(dǎo)武器和某型無人機(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)河公司成功推出以來,已被廣泛應(yīng)用于通信、軍事、航空、航天等高精尖及實(shí)時(shí)性要求較高領(lǐng)域。
在實(shí)時(shí)性要求高的應(yīng)用系統(tǒng)中,定時(shí)器經(jīng)常會(huì)被用到。VxWorks提供了多樣的定時(shí)器接口函數(shù),但沒有通用定時(shí)器。在VxWorks提供的定時(shí)器接口函數(shù)中,taskDelay()、WatchDog和 sleep/nanosleep都以 tick為基準(zhǔn),定時(shí)誤差較大[1],無法滿足高精度的定時(shí)要求,若把系統(tǒng)clockrate(默認(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í)鐘相同的操作接口,可以通過掛接用戶自己中斷服務(wù)程序的方式實(shí)現(xiàn)精確延時(shí),當(dāng)輔助時(shí)鐘的定時(shí)周期到時(shí),即觸發(fā)中斷服務(wù)程序。本文針對(duì)多任務(wù)長(zhǎng)時(shí)間工作的高精度定時(shí)需求提出了基于輔助時(shí)鐘的通用定時(shí)器機(jī)制。
在VxWorks下要利用輔助時(shí)鐘,首先要對(duì)輔助時(shí)鐘的使用進(jìn)行配置,以確保輔助時(shí)鐘可以被正常使用,然后分別調(diào)sysAuxClkConnect()函數(shù)將中斷服務(wù)程序與輔助時(shí)鐘中斷掛接、sysAuxClkRate()函數(shù)設(shè)置輔助時(shí)鐘中斷周期、sysAuxClkEnable()/sysAuxClkDisable()函數(shù)允許和禁止輔助時(shí)鐘。
通過對(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)?則說明該節(jié)點(diǎn)定時(shí)時(shí)間到,此時(shí)進(jìn)行相應(yīng)的操作,從而達(dá)到精確定時(shí)的目的??赏ㄟ^同步信號(hào)量來調(diào)用定時(shí)節(jié)點(diǎn)處理任務(wù)來處理已經(jīng)定時(shí)到的節(jié)點(diǎn)。以下是輔助時(shí)鐘使用的基本原理
由此可看出,通過中斷服務(wù)程序,將輔助時(shí)鐘與定時(shí)任務(wù)聯(lián)系起來,為精確定時(shí)提供了可能。
根據(jù)上述特點(diǎn),可將所有的定時(shí)任務(wù)通過一個(gè)定時(shí)任務(wù)鏈表與基于輔助時(shí)鐘設(shè)置的定時(shí)器關(guān)聯(lián)起來,每當(dāng)程序應(yīng)用層添加一個(gè)定時(shí)任務(wù),就往該定時(shí)任務(wù)鏈表添加一個(gè)定時(shí)任務(wù)節(jié)點(diǎn)。通常的添加方法是,插入時(shí)從鏈表頭節(jié)點(diǎn)開始遍歷,根據(jù)各個(gè)節(jié)點(diǎn)的剩余時(shí)間來確定插入位置,即將所要插入的定時(shí)任務(wù)節(jié)點(diǎn)按照相對(duì)其前一節(jié)點(diǎn)剩余時(shí)間的差由小到大排列。這樣,當(dāng)輔助時(shí)鐘中斷到來時(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。
圖1 定時(shí)任務(wù)鏈表的插入
定時(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ù)主要用來初始化定時(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í)要開啟輔助時(shí)鐘。
定時(shí)節(jié)點(diǎn)刪除函數(shù)TimerCancle(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ǔ),其通過函數(shù)sysAuxClkConnect()連接到輔助時(shí)鐘中斷上。為保證定時(shí)精確性,應(yīng)使此中斷程序最短執(zhí)行。為此建立有序的定時(shí)節(jié)點(diǎn)鏈表,每次中斷時(shí)只需從鏈表節(jié)點(diǎn)首開始遍歷找到第一個(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í)行過程如圖2。
圖2 輔助時(shí)鐘中斷服務(wù)程序的執(zhí)行流程
中斷處理任務(wù)TimerSvrTask()主要用來處理已經(jīng)到時(shí)的節(jié)點(diǎn)。該任務(wù)生成后等待同步信號(hào)量,如果獲得該信號(hào)量,則從傳遞來的第一個(gè)節(jié)點(diǎn)開始遍歷所有timeLeft為0的節(jié)點(diǎn),然后執(zhí)行節(jié)點(diǎn)對(duì)應(yīng)的函數(shù)或者釋放節(jié)點(diǎn)對(duì)應(yīng)的信號(hào)量,最后再根據(jù)到時(shí)節(jié)點(diǎn)的timerType判斷:若該定時(shí)節(jié)點(diǎn)為單次則把該節(jié)點(diǎn)設(shè)為不可用;若該定時(shí)節(jié)點(diǎn)為周期性的,則先將該節(jié)點(diǎn)從鏈表中取出,重新初始化剩余時(shí)間后再次插入鏈表中的恰當(dāng)位置。
需要說明的是,基于輔助時(shí)鐘的通用定時(shí)器需要CPU的一個(gè)時(shí)鐘資源,且輔助時(shí)鐘的使用會(huì)和調(diào)試工具SpyChart沖突,使用時(shí)應(yīng)特別注意[1]。
由于定時(shí)節(jié)點(diǎn)鏈表以及程序中用到的其它全局變量相對(duì)所有的任務(wù)都是共享數(shù)據(jù),因此為保持?jǐn)?shù)據(jù)使用的一致性,需要加以保護(hù),以防止多個(gè)任務(wù)對(duì)共享數(shù)據(jù)的使用沖突。對(duì)于有輔助時(shí)鐘中斷服務(wù)程序參與的數(shù)據(jù),例如鏈表,其他任務(wù)在對(duì)鏈表操作前需要先禁止中斷,操作完畢后再允許中斷,以防出現(xiàn)中斷與任務(wù)的不一致問題;對(duì)于輔助時(shí)鐘中斷服務(wù)程序不參與的數(shù)據(jù),各任務(wù)對(duì)它的訪問采用互斥信號(hào)量方式即可。
當(dāng)前,基于輔助時(shí)鐘的通用定時(shí)器已在某無人機(jī)發(fā)射裝置中的強(qiáng)實(shí)時(shí)命令傳遞、通訊數(shù)據(jù)幀收發(fā)以及目標(biāo)系統(tǒng)狀態(tài)監(jiān)控方面得到了應(yīng)用,滿足了毫秒級(jí)的單次和周期交叉定時(shí)要求,效果良好。該定時(shí)器機(jī)制對(duì)所用接口進(jìn)行了封裝,使其具有了較好的繼承性和擴(kuò)展性,為今后此類系統(tǒng)中的精確定時(shí)需求提供了方便。
[1]林先賢.VxWorks幾種常用的延時(shí)方法[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2007(5):61 -62,65.
[2]劉大明,孫超超,金一鳴.VxWorks系統(tǒng)時(shí)鐘獲取和定時(shí)功能分析[J].核電子學(xué)與探測(cè)技術(shù),2009,29(6):1366-1368,1431.
[3]姚崇華,姜新紅,程凌宇,等.多線程應(yīng)用中的定時(shí)器管理算法[J].計(jì)算機(jī)工程,2010,36(2):75-77.
[4]王文竹,郭華,吳慶波.基于PowerPC的高精度定時(shí)器設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(16):267 -269.
[5]李林,王向輝,陶利民,等.航天器用實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2012,20(4):1026 -1028,1032.
[6]姜婷,張吟.VxWorks下基于看門狗的通用定時(shí)器設(shè)計(jì)[J].電子技術(shù),2011(9):35 -37.
[7]李慧璐.對(duì)VxWorks中內(nèi)存管理和定時(shí)器模塊的改進(jìn)[D].西安:西安電子科技大學(xué),2009.
[8]孔祥營(yíng),柏桂枝.VxWorks及開發(fā)環(huán)境 Tornado[M].北京:中國(guó)電力出版社,2002.
[9]鄺堅(jiān).Tornado/VxWorks入門與提高[M].北京:科學(xué)出版社,2004.