白曉慧
【摘 要】比較了基于VxWorks操作系統(tǒng)的多種延時方法,編寫了基于系統(tǒng)時鐘定時器的延時方法的中斷服務(wù)程序。該方法精確,可靠。已在工程實踐中,證實了該方法的有效性以及精確性。
【關(guān)鍵詞】VxWorks操作系統(tǒng);延時方法;中斷服務(wù)程序
0 引言
VxWorks操作系統(tǒng)是運行在目標(biāo)機(jī)上的高性能、可裁剪的嵌入式實時多任務(wù)操作系統(tǒng),其良好的可靠性和卓越的實時性被廣泛地應(yīng)用在通信、軍事、航空、航天、航海等高精尖技術(shù)及實時性要求極高的領(lǐng)域中。
在實際的工程應(yīng)用中,周期任務(wù),需要有最大的延遲或稱為等待時間。這類任務(wù)一般會為BIT檢測任務(wù),鏈路檢測任務(wù),點跡查詢?nèi)蝿?wù)等。這段等待時間,在VxWorks操作系統(tǒng)中,可以通過多種延時方法實現(xiàn)。
1 taskDelay法
1.1 原理
taskDelay()是最簡單的延時方法。延時操作提供了一個簡單的任務(wù)休眠機(jī)制。當(dāng)一個任務(wù)調(diào)用taskDelay()后,它將主動放棄CPU一段時間,進(jìn)入Delay狀態(tài)。超時后,這個任務(wù)會排到Ready隊列中同優(yōu)先級隊列的隊尾等待執(zhí)行。它的單位是tick,tick是VxWorks下的時鐘中斷頻率,可以通過sysClkRateSet()設(shè)置,一般在60-100之間。在體系架構(gòu)、CPU頻率等硬件條件允許的范圍內(nèi),這個值可以隨意設(shè)置。不過,設(shè)置的時候要根據(jù)實際需要,而不是每個時間片的間隔越短越好。時間片的數(shù)量影響著內(nèi)核每秒鐘調(diào)度的次數(shù),而每次內(nèi)核調(diào)度都需要消耗一定的CPU資源。如果每秒產(chǎn)生的時間片數(shù)量過大,內(nèi)核調(diào)度所消耗的CPU資源就會過多,從而影響整機(jī)效率。在實際工程中,一般選取每秒tick數(shù)為100??梢酝ㄟ^調(diào)用taskDelay(0),將CPU交給同等優(yōu)先級的任務(wù)。由于其延時的基本單位為tick,因此,最小延時單位為10ms,延時精度不高。
一般來說,當(dāng)該任務(wù)通過taskDelay()進(jìn)入睡眠狀態(tài)時,若這段時間內(nèi)被高優(yōu)先級的任務(wù)占有資源時,則一直得等高優(yōu)先級的任務(wù)放棄資源時,這個任務(wù)才會獲得資源。
因此,taskDelay()延時很方便,卻需要有一定的風(fēng)險。實際的延時時間為預(yù)設(shè)延時時間與排隊等候時間之和,這樣將會導(dǎo)致延時不準(zhǔn)確,也對任務(wù)的調(diào)度安排提出了一個挑戰(zhàn)。這樣看來,時間片延時并不是很準(zhǔn)確,其準(zhǔn)確程度需要根據(jù)任務(wù)調(diào)度的狀況來決定。如果沒有任務(wù)占用CPU,等待的誤差不超過一個時間片的時間長短;如果有高優(yōu)先級或同優(yōu)先級的任務(wù)不釋放CPU資源,那么等待將直到任務(wù)獲取CPU資源才能結(jié)束。
1.2 具體實現(xiàn)
STATUS taskDelay(int ticks)
2 看門狗法
2.1 原理
實時系統(tǒng)任務(wù)的執(zhí)行一般都有時限的約束。VxWorks提供了一種看門狗定時器機(jī)制,允許用戶編寫的函數(shù)與一個特定的時延相聯(lián)系。這個時延,也是以tick來計量的。任何一個任務(wù)都可以創(chuàng)建Watchdog Timer并指定定時器超時后執(zhí)行的例程。這個例程是在系統(tǒng)時鐘ISR的上下文中執(zhí)行,因此它具有與中斷一樣的優(yōu)先級。Watchdog Timer并非一個周期性的定時器,在超時停止或是中途放棄計時之后,將一直處于靜止?fàn)顟B(tài)。這一點與系統(tǒng)時鐘不同。
看門狗定時器超時之后,指定的函數(shù)在中斷級執(zhí)行??梢阅7耉xWorks中對異常處理的方法,采用分步處理的方法:在Watchdog Timer的ISR中所作的知識發(fā)送signal,或是釋放信號量等一些簡單的操作,而創(chuàng)建專用的task等待接收這類信號,依據(jù)信號的指示再去執(zhí)行相應(yīng)的復(fù)雜處理。這樣既不會影響系統(tǒng)的實時性,也可以滿足用戶多樣的需求。
這種計時方法可以提供比較精確的計時,其原因在于定時時間一到,所安排的任務(wù)會以中斷級別或更高任務(wù)優(yōu)先級執(zhí)行。作為代價,看門狗定時器比taskDelay()消耗了更多的系統(tǒng)資源,包括存儲空間和處理器時間。事實上,整個處理的過程可能還會增加中斷處理時間。
2.2 具體實現(xiàn)
需要創(chuàng)建看門狗,并啟動。所需函數(shù)如下:
int wdCreate()
STATUS wdStart(WDOG_ID wdId, int delay, FUNCPTR pRoutine, int parameter)
3 系統(tǒng)時鐘定時器法
3.1 原理
定時器機(jī)制的實現(xiàn)是建立在時鐘基礎(chǔ)上的。VxWorks為支持精確實時控制,利用不同的硬件定時器提供了系統(tǒng)時鐘和系統(tǒng)輔助時鐘。由于這兩個時鐘都以周期時鐘形式運行,因此相關(guān)的硬件定時器的運行方式也是周期形式。每經(jīng)過一個固定的時間間隔,硬件定時器的ISR將通知VxWorks內(nèi)核。系統(tǒng)時鐘的周期稱為tick,定時的時長只能是tick的整數(shù)倍。由于系統(tǒng)時鐘,處理系統(tǒng)級任務(wù),因而時鐘頻率一般不能很高。但是可以設(shè)置系統(tǒng)輔助時鐘的tick數(shù),使其達(dá)到精確地定時。
硬件中斷處理是實時系統(tǒng)設(shè)計的最重要、最關(guān)鍵的問題。由于中斷通常對應(yīng)著外部事件,系統(tǒng)通過中斷與外部事件交互。為了獲得盡可能快的中斷響應(yīng)事件,VxWorks的中斷處理程序運行在特定的上下文中。因此,中斷處理不會涉及任務(wù)任務(wù)上下文的交換。
應(yīng)用程序可以使用VxWorks未用的硬件中斷。VxWorks提供函數(shù)intConnect(),它允許指定的C函數(shù)與任意中斷相聯(lián)系。intConnect()函數(shù)原型是:
STATUS intConnect
(VOIDFUNCPTR *vector, VOIDFUNCPTR routine, int parameter)
只要在工程中定義了INCLUDE_SYSCLK_INT,系統(tǒng)就會自動完成對系統(tǒng)時鐘的初始化,也就是在文件usrConfig.c中的usrRoot()函數(shù)中實現(xiàn)??紤]到需要根據(jù)實際工程中的需求,需要對不同的周期任務(wù)設(shè)定不同的定時器,因而選擇自己對系統(tǒng)時鐘進(jìn)行初始化。本文中設(shè)置了10個定時器,分別為定時10ms,20ms,50ms,100ms,200ms,500ms,1s,2s,5s,10s。
3.2 具體實現(xiàn)
bool timeInital()
初始化時,首先應(yīng)該關(guān)中斷;其次,調(diào)用sysClkConnect()掛接時間中斷服務(wù)程序;然后再通過調(diào)用sysClkRateSet()來設(shè)置系統(tǒng)時鐘每秒中斷的次數(shù);最后再通過調(diào)用sysClkEnable()使能對系統(tǒng)時鐘中斷的響應(yīng)。
中斷服務(wù)程序中,需要首先調(diào)用tickAnnounce(),來通知內(nèi)核一個tick事件。本項目工程的中斷服務(wù)程序完成的操作包括:(1)獲取并保存系統(tǒng)時鐘ISR要調(diào)用的例程;(2)關(guān)聯(lián)系統(tǒng)時鐘ISR;(3)對中斷次數(shù)計數(shù);(4)更新定時器使能標(biāo)志。
需要說明的是,需要定義定時器的結(jié)構(gòu)。若定義多個定時器,則定時器的結(jié)構(gòu)中需包含編號,定時器的時間間隔數(shù),定時器的時間毫秒數(shù)和定時標(biāo)志。定時標(biāo)志就是定時時刻到為true,否則為false。若定時時刻到,會通知另一個標(biāo)志,并重新將定期器定時標(biāo)志置為false。
4 小結(jié)
本文結(jié)合工程實踐,比較了基于VxWorks操作系統(tǒng)下的多種延時方法。硬件方面,時鐘芯片會在確定的時間內(nèi)為系統(tǒng)產(chǎn)生一個中斷。軟件方面,中斷響應(yīng)的過程也就是計時的過程,不過系統(tǒng)不會為每一次中斷都進(jìn)行處理,而是經(jīng)過一定計數(shù)之后才會產(chǎn)生一個時間片。計時控制的目的就是在一段時間之后開始特定的工作。taskDelay是延時結(jié)束后將任務(wù)置于就緒隊列等候調(diào)度,直至CPU資源可用時執(zhí)行被延遲的任務(wù)??撮T狗法和系統(tǒng)時鐘定時器法是基于硬件時鐘的, 因而可靠性高。對系統(tǒng)時鐘定時器的中斷服務(wù)程序進(jìn)行了修改,達(dá)到了定時的目的。
【參考文獻(xiàn)】
[1]Vxworks Programmer Guide, WindRiver[Z]. 1999.
[2]羅國慶.Vxworks與嵌入式軟件開發(fā)[M].機(jī)械工業(yè)出版社,2003,9.
[3]孔祥營,柏桂枝.嵌入式實時操作系統(tǒng)Vxworks及其開發(fā)環(huán)境Tornado[Z]. 2002, 1.
[責(zé)任編輯:楊玉潔]