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