張 宇,王省書,胡春生
(國防科學技術(shù)大學光電科學與工程學院,長沙410073)
VxWorks操作系統(tǒng)是由美國Wind River System公司推出的一款嵌入式實時操作系統(tǒng)。該操作系統(tǒng)憑借其高性能的微內(nèi)核、卓越的可靠性和實時性廣泛的應(yīng)用在通信、軍事、航天、航空等高精尖技術(shù)及實時性要求極高的領(lǐng)域[1]。
VxWorks系統(tǒng)支持組件裁剪、多任務(wù)調(diào)度、任務(wù)間管理通信等功能,在任務(wù)量較多的應(yīng)用中,為了保證所裁剪系統(tǒng)的實時性,需研究VxWorks在不同任務(wù)數(shù)量下的實時性性能。利用PC104硬件平臺,設(shè)計了測量程序?qū)θ蝿?wù)搶占切換時間進行測試,進而得出了內(nèi)核任務(wù)切換時間在多任務(wù)運行環(huán)境下占用的時間開銷。同時根據(jù)信號量機制設(shè)計了任務(wù)間通信程序,并對實時性的影響進行了定量測試與分析。
在VxWorks操作系統(tǒng)中,可以使用taskSpawn()函數(shù)創(chuàng)建任務(wù),創(chuàng)建的新任務(wù)有自己的上下文,如CPU環(huán)境、系統(tǒng)資源等,這些任務(wù)的上下文保存在任務(wù)控制模塊(TCB)中[2]。
操作系統(tǒng)在單處理器環(huán)境下是無法實現(xiàn)多任務(wù)同時并發(fā)執(zhí)行的,也就是說多任務(wù)必須通過一定的調(diào)度算法分時執(zhí)行。VxWorks的實時內(nèi)核Wind為Vx-Works的多任務(wù)實現(xiàn)提供了基礎(chǔ),并為多任務(wù)的分時執(zhí)行提供了基于優(yōu)先級的搶占式任務(wù)調(diào)度機制[3]。
Wind內(nèi)核里設(shè)置有256種優(yōu)先級,優(yōu)先級從0到255,優(yōu)先級0為最高,優(yōu)先級255為最低[4]。任務(wù)在創(chuàng)建的時候分配一個優(yōu)先級,使用基于優(yōu)先級的搶占式任務(wù)調(diào)度算法,在任意時刻,內(nèi)核將CPU分配給處于就緒態(tài)的優(yōu)先級最高的任務(wù)運行。這意味著當某個任務(wù)比當前執(zhí)行任務(wù)的優(yōu)先級高,并處于就緒狀態(tài),那么系統(tǒng)內(nèi)核將立刻保存當前執(zhí)行任務(wù)的上下文到TCB中,切換到高優(yōu)先級任務(wù)的上下文中去,執(zhí)行高優(yōu)先級任務(wù)。任務(wù)搶占調(diào)度實例如圖1所示。
圖1 優(yōu)先級搶占調(diào)度示意圖
在VxWorks操作系統(tǒng)的多任務(wù)環(huán)境下,各個任務(wù)需要分時執(zhí)行,為了保證各個任務(wù)在特定的時刻能夠搶占CPU完成相關(guān)功能,則需要根據(jù)任務(wù)的優(yōu)先級高低來對執(zhí)行任務(wù)合理安排。因此,任務(wù)間的搶占執(zhí)行是系統(tǒng)完成一個功能的必要條件。同時這種基于優(yōu)先級的任務(wù)搶占切換時間也是VxWorks實時性的主要特征,該時間越短,說明多個任務(wù)運行花在切換上的時間開銷越小,對緊急任務(wù)的響應(yīng)越快,實時性越好。
Workbench提供的System Viewer盡管以圖像化顯示任務(wù)切換的先后關(guān)系,但并不能測試出具體的時間數(shù)據(jù)。VxWorks系統(tǒng)提供并口輸出組件,可以使用示波器測試并口中數(shù)據(jù)引腳電壓變化,得出任務(wù)切換時間,但切換時調(diào)用I/O函數(shù)輸出需要一定的時間,影響測試精度,另外這種方法對測試硬件的依賴性也比較高。因此,考慮直接在VxWorks系統(tǒng)下利用自身頻率時鐘,設(shè)計程序?qū)崿F(xiàn)時間測試。
測試VxWorks的任務(wù)切換時間,需要一個高精度時鐘。VxWorks提供操作系統(tǒng)時鐘,該時鐘在操作系統(tǒng)運行后便開始計數(shù),計數(shù)精度為1tick,可以通過調(diào)用tickGet()獲取當前計數(shù)值。因為系統(tǒng)時鐘默認工作頻率為60Hz,一個tick相當于16.7ms,不符合測試精度。盡管可以通過函數(shù)sysClkRateSet(1000),將1秒平分為1000等份,每一份為系統(tǒng)時鐘的一個tick,這樣雖然可以將精度提高到1ms,但1kHz的系統(tǒng)時鐘中斷頻率會使得CPU的開銷大增,反而降低了操作系統(tǒng)的性能。
硬件測試平臺選用數(shù)字邏輯公司生產(chǎn)的一款PC104,X86架構(gòu),Pentium 處理器,主頻 500MHz??紤]到Intel Pentium級以上的CPU都提供了64位寄存器“時間戳”部件,用以記錄CPU自上電后開始經(jīng)過的時間戳數(shù)量。目前CPU的頻率較高,這種定時可以達到微秒級精度甚至更高,因此選用CPU計數(shù)器作為切換時間測量工具。盡管CPU的每一個時鐘周期不完全相等,計時數(shù)據(jù)會存在一定的抖動,但相對主頻500MHz的CPU,其抖動數(shù)值在系統(tǒng)中可以忽略[5]。
在VxWorks操作系統(tǒng)中使用CPU時間戳,需要修改BSP,將pentiumLib.h頭文件添加到BSP中,便可在程序開發(fā)中調(diào)用 pentiumTscGet32()、pentiumTscGet64()、pentiumTsReset()。其中,pentiumTscGet32提供了對時間戳計數(shù)器的低32位訪問,pentiumTscGet64提供了對整個寄存器64位值的訪問。
利用時間戳方法可以測試程序執(zhí)行時間,對于某段待測試程序只需在程序執(zhí)行前后加入函數(shù)調(diào)用系統(tǒng)時間戳,在程序執(zhí)行后將兩次獲得數(shù)據(jù)相減,最后除以CPU頻率便可得出程序執(zhí)行的具體時間。
同樣,可以設(shè)計程序利用CPU計數(shù)器為任務(wù)搶占切換時間提供時間戳:優(yōu)先級為N的任務(wù)A占用CPU,任務(wù)B優(yōu)先級為N-1,某個時刻任務(wù)B優(yōu)先級加2,同時記錄時間戳,任務(wù)B搶占CPU后優(yōu)先級馬上-2,任務(wù)A重新?lián)屨糃PU,再一次記錄時間戳。整個過程發(fā)生了兩次搶占,將兩次的時間戳相減后除以2,再除以500MHz的CPU頻率,即可得出任務(wù)切換時間。
2.3.1 簡單環(huán)境下任務(wù)切換時間測試
在程序中只創(chuàng)建兩個任務(wù),分別為主任務(wù)和子任務(wù),根據(jù)上述測試方法,對任務(wù)搶占切換時間進行測試。將測試循環(huán)100次,測試結(jié)果如圖2所示。最小 值 0.9945μs,最 大 值 1.6579μs,平 均 值1.3257μs,切換時間波動在0.7μs以內(nèi),標準方差值為0.1381μs,從數(shù)據(jù)中可以看出VxWorks的任務(wù)切換時間非常穩(wěn)定。
另外需要說明的是,在大量的循環(huán)測試中,會出現(xiàn)個別明顯高于其他數(shù)據(jù)值的數(shù)據(jù)點,這是由于VxWorks操作系統(tǒng)后臺中存在一些優(yōu)先級為0的默認任務(wù),其中某些默認任務(wù)按一定周期循環(huán)執(zhí)行。在一定時刻,這些默認任務(wù)的執(zhí)行正好阻塞了測試任務(wù),從而導(dǎo)致了測試時間的顯著增大,在處理數(shù)據(jù)時只需要將這些數(shù)據(jù)點刪除即可。在實際應(yīng)用中,可更改任務(wù)屬性,將這些任務(wù)改為掛起態(tài),避免阻塞其他任務(wù)的執(zhí)行。
圖2 雙任務(wù)運行時任務(wù)切換時間
2.3.2 復(fù)雜環(huán)境下任務(wù)切換時間測試
為了測試在多任務(wù)環(huán)境下任務(wù)搶占切換時間,在VxWorks操作系統(tǒng)中添加4個任務(wù),分別為tCosmos、tSchlep、tCrunch、tMontier。其中 tCosmos任務(wù)用來模擬中斷服務(wù)產(chǎn)生新數(shù)據(jù);tSchlep任務(wù)完成數(shù)據(jù)采集功能并將采集到的數(shù)據(jù)組成一個樣本;tCrunch任務(wù)完成數(shù)據(jù)處理功能;tMontier任務(wù)將處理結(jié)果顯示。這4個任務(wù)依次運行一次為程序的一個周期,測試時使其運行100個周期,分別測試5組,運用時間戳方法,分別得出程序運行時間和任務(wù)切換總時間,進而可得出任務(wù)搶占所花費的時間開銷百分比如表1所示。
表1 程序執(zhí)行總時間與切換總時間測試
從數(shù)據(jù)中可以看出,任務(wù)搶占切換時間的開銷非常小,體現(xiàn)出了VxWorks操作系統(tǒng)良好的實時性。同時,測量了在4個任務(wù)運行時,每次任務(wù)優(yōu)先級搶占切換時間,見圖3,從圖中數(shù)據(jù)看出,切換時間最小值1.0479μs,最大值1.6779μs,平均值1.3657μs。
圖3 多任務(wù)運行時任務(wù)切換時間
同樣,在VxWorks操作系統(tǒng)中繼續(xù)增加任務(wù)數(shù)量,測量不同任務(wù)數(shù)量下的任務(wù)切換時間,結(jié)果見表2。從測量數(shù)據(jù)中可以得出,任務(wù)搶占切換時間并沒有因為任務(wù)數(shù)量的增加而大幅增加,百分之一微秒數(shù)量級的增加主要是因為操作系統(tǒng)在運行時,內(nèi)核Wind需要根據(jù)系統(tǒng)時鐘周期查詢?nèi)蝿?wù)列表tasklist,從而決定哪個任務(wù)應(yīng)該優(yōu)先占有CPU資源,因此這個任務(wù)列表中的任務(wù)數(shù)量越多,Wind內(nèi)核查詢時間越長,對切換時間有一定的影響。
表2 多任務(wù)切換時間測試
在基于優(yōu)先級的搶占式任務(wù)調(diào)度中,可以使緊急任務(wù)優(yōu)先執(zhí)行,這種算法盡管保證了系統(tǒng)的實時性,但也增加了系統(tǒng)的復(fù)雜性。任務(wù)間對臨界資源的競爭會使一個高優(yōu)先級的任務(wù)被迫等待一個低優(yōu)先級任務(wù)完成后才能執(zhí)行,這種情況會產(chǎn)生優(yōu)先級翻轉(zhuǎn)。因此,為了加強任務(wù)控制,需要使用任務(wù)間的通信機制。
在VxWorks中,信號量被高度優(yōu)化,提供了最快的任務(wù)間通信機制,是實現(xiàn)任務(wù)間互斥與同步的最主要手段。VxWorks提供了二進制信號量、計數(shù)信號量和互斥信號量3種信號量[6]。其中,二進制信號量是最基本的信號量,速度最快,能夠滿足通常的互斥和同步操作[7]。
在VxWorks中,為實現(xiàn)信號量機制所提供的函數(shù)庫是semLib.h,可通過調(diào)用該函數(shù)庫中的semB-Create()、semCCreate()、semMCeate()分別創(chuàng)建二進制信號量、計數(shù)信號量和互斥信號量。信號量通過上述函數(shù)創(chuàng)建后將返回一個信號量ID,該ID為隨后其他信號量控制函數(shù)的使用提供句柄。
使用VxWorks進行實時多任務(wù)建立和任務(wù)間的信號量通信,主要步驟如下:
(1)利用taskSpawn()函數(shù)創(chuàng)建多個任務(wù),建立多任務(wù)環(huán)境;
(2)通過semBCreate()、semCCreate()、semMCeate()函數(shù)創(chuàng)建信號量,用于任務(wù)間的同步與協(xié)調(diào);
(3)通過semSend()、semGive()函數(shù)獲取和釋放信號量,實現(xiàn)任務(wù)的同步或互斥;
(4)任務(wù)完成相關(guān)功能后,調(diào)用taskDelete()、semDelete函數(shù)刪除相關(guān)任務(wù)和信號量,釋放資源。
根據(jù)上述開發(fā)步驟,設(shè)計程序部分代碼如下:
#include"vxWorks.h"
#include"taskLib.h"
#include"semLib.h"
#include"stdio.h"
void taskA(void);
void taskB(void);
SEM_ID semId1,semId2;/*定義信號量ID*/
void binary(void)
{int taskIdA,taskIdB;
semId1=semBCreate(SEM_Q_FIFO,SEM_FULL);
semId2=semBCreate(SEM_Q_FIFO,SEM_EMPTY);/*創(chuàng)建信號量,信號量1初始狀態(tài)可用,信號量2初始狀態(tài)不可用*/
taskIdA=taskSpawn("tTaskA",120,0,2000,(FUNCPTR)taskA,0,0,0,0,0,0,0,0,0,0);
taskIdB=taskSpawn("tTaskB",120,0,2000,(FUNCPTR)taskB,0,0,0,0,0,0,0,0,0,0);
/*創(chuàng)建任務(wù)A、B*/}
void taskA(void)
{semTake(semId1,WAIT_FOREVER);/* 獲取信號量1*/
/* 處理任務(wù)A的相關(guān)事務(wù)*/;…
semGive(semId2);/*釋放信號量2*/}
void taskB(void)
{semTake(semId2,WAIT_FOREVER);/* 等待信號量2,直至其被任務(wù)A釋放 */
/* 處理任務(wù)B的相關(guān)事務(wù)*/;…
semGive(semId1);/*釋放信號量1*/}
將程序代碼在Wind River Workbench中編譯生成.out文件,文件加載到集成仿真器VxSim,并啟動命令解釋工具WindSh,輸入->sp binary,調(diào)用主函數(shù)binary(),發(fā)起任務(wù)A和任務(wù)B,程序開始執(zhí)行,執(zhí)行情況如圖4所示。同時,可以通過開發(fā)環(huán)境提供的軟件邏輯分析儀WindView對系統(tǒng)各個任務(wù)的運行情況進行觀察分析。從圖5中可以觀察到,任務(wù)A與任務(wù)B在信號量的控制下,分別有序處理各自事務(wù)。
圖4 信號量控制下任務(wù)執(zhí)行情況仿真
圖5 VxWorks中的多任務(wù)運行時序
同樣利用時間戳方法,測試在使用信號量控制時,任務(wù)搶占時間的大小。測試程序應(yīng)用上述的二進制信號量程序代碼,只需將在任務(wù)釋放和獲得信號量的同時添加時間戳調(diào)用函數(shù)記錄數(shù)據(jù),對數(shù)據(jù)通過簡單的計算即可得出任務(wù)切換時間。信號量測試程序循環(huán)測試100次,測試結(jié)果如圖6所示。
圖6 信號量機制下任務(wù)切換時間
圖中○表示沒有使用二進制信號量時,任務(wù)切換時間的數(shù)據(jù)點,最小值 0.9945μs,最大值1.6579μs,平均值1.3257μs。△符號表示的是在信號量控制下,任務(wù)搶占時間的數(shù)據(jù),最小值1.1459μs,最大值 1.7158μs,平均值 1.4109μs。
與二進制信號量的程序設(shè)計和測試方法相似,對計數(shù)信號量和互斥信號量進行測試,測試結(jié)果見表3。比較圖6和表3中的數(shù)據(jù)可發(fā)現(xiàn),使用信號量后,任務(wù)切換平均時間僅僅增大了約0.1μs,并沒有對任務(wù)的搶占造成很大的延時,這是由于Wind內(nèi)核對信號量做了優(yōu)化,增加的時間主要是由于處理器解讀信號量代碼所造成的,并且這三種信號量的切換時間沒有顯著差異。因此,在VxWorks的具體開發(fā)中,可根據(jù)三種信號量各自的特點應(yīng)用在不同需求的任務(wù)控制中。
表3 三種信號量的任務(wù)切換時間測試
任務(wù)切換時間反映了實時操作系統(tǒng)對緊急任務(wù)的響應(yīng)速度。本文利用CPU計數(shù)器提供時間測量工具,對任務(wù)搶占切換時間進行了測試,分析了多任務(wù)環(huán)境下任務(wù)的實時性。同時設(shè)計了信號量通信機制程序,結(jié)合測試數(shù)據(jù),分析了信號量機制對操作系統(tǒng)實時性的影響。該測量方法不需要其它測試硬件的輔助,操作簡單,且還可以對某段程序執(zhí)行時間進行測試,在程序調(diào)試時有利于優(yōu)化源代碼,進一步提高執(zhí)行效率,具有廣泛的應(yīng)用性。
[1]王金剛,宮霄霖,蘇琪,等.基于VxWorks的嵌入式實時系統(tǒng)設(shè)計[M].北京:清華大學出版社,2004-10.
[2]金敏,周翔,金梁.嵌入式系統(tǒng)組成、原理與設(shè)計編程[M].北京:人民郵電出版社,2006.
[3]王永亮,李秀娟.嵌入式多任務(wù)程序設(shè)計[J].電子科技,2010,23(1):94 -96.
[4]李洪亮,侯朝楨,周紹生.VxWorks下實時多任務(wù)程序的實現(xiàn)[J].微計算機信息,2008(7-2):90-91.
[5]Wind River Inc.VxWorks Programmer’s Guide 5.5[C].[2008 -06 -23].http://www.windriver.com.
[6]張楊,于銀濤.VxWorks內(nèi)核、設(shè)備驅(qū)動與BSP開發(fā)詳解[M].北京:人民郵電出版社,2009.
[7]李俊.VxWorks下多任務(wù)間通信方式的比較與分析[J].信息技術(shù),2009(25):24-25.