朱輝慶
(海軍駐杭州地區(qū)軍事代表室 杭州 310012)
并行[1]是一種自然現(xiàn)象。在現(xiàn)實世界中,任何時候都會有許多事件同時發(fā)生。當(dāng)設(shè)計軟件以監(jiān)測和控制現(xiàn)實世界中的系統(tǒng)時,就必須處理這種自然的并行。此外并行處理可提高處理速度、提高系統(tǒng)的可控性。但當(dāng)處理軟件系統(tǒng)中的并行問題時,常常有兩個非常重要的方面:能夠檢測并響應(yīng)以任意順序出現(xiàn)的外部事件;確保在要求的最短時間內(nèi)作出響應(yīng)。
如果各個并行活動獨立進行(即以完全平行的方式進行),問題就相對簡單:只需建立單獨的程序來處理每項活動。設(shè)計并行系統(tǒng)之所以困難,主要是由并行活動之間的交互造成的。當(dāng)并行活動進行交互時,共享資源需要加以控制和協(xié)調(diào)。
公路交通系統(tǒng)可作為一種形象的類比。不同道路上的平行車流基本上不會相互影響,所以很少產(chǎn)生問題。相鄰車道上的平行車流為了交互時的安全,需要作一些協(xié)調(diào)。而在十字路口則會發(fā)生非常劇烈的交互,在這里需要進行周密的協(xié)調(diào)。因此,許多實時軟件系統(tǒng)都必須“反應(yīng)靈敏”,而且可能在任意時間以任意順序產(chǎn)生、執(zhí)行。
圖1 公路交通系統(tǒng)
但并行軟件它有許多困難,大多數(shù)計算機和編程語言從發(fā)明之日起就屬于順序設(shè)計。一個過程或處理器在某一時刻只執(zhí)行一條指令。而很多中小系統(tǒng)只有一個處理器,在單個順序處理器中,必須通過交替執(zhí)行不同任務(wù)來造成并行的假象。困難并不在其技術(shù)細節(jié)上,而在于決定何時和如何交替執(zhí)行可能交互的程序段。
對于多個處理器,并行雖然很容易實現(xiàn),但是交互情況卻變得更加復(fù)雜。首先,運行于不同處理器上的各項任務(wù)之間的通信就存在問題。由于通常要涉及到軟件的若干層次,因而會增加復(fù)雜性和定時開支。由于時鐘和定時有可能不同,而各構(gòu)件又可能會分別發(fā)生故障,所以多CPU系統(tǒng)的確定性也會有所降低。
要支持并行,系統(tǒng)必須提供多個控制線程??刂凭€程的抽象可由軟件和硬件通過多種方式來實施。最常用的機制為以下某種機制的變形即多處理、多任務(wù)、基于應(yīng)用程序的解決方案。當(dāng)操作系統(tǒng)提供多任務(wù)時,常見的并行單元為進程。各進程可能有三種狀態(tài):1)阻塞―等待接收某一輸入或獲得某一資源的控制權(quán);2)就緒― 等待操作系統(tǒng)安排它執(zhí)行;3)運行―實際使用CPU。
此外,通常會給進程分配相對的優(yōu)先級。操作系統(tǒng)內(nèi)核根據(jù)進程的狀態(tài)、優(yōu)先級以及某種調(diào)度策略來確定在任一給定時刻應(yīng)當(dāng)運行哪一個進程。實際上,多任務(wù)操作系統(tǒng)在其所有進程中共享一個控制線程,爭用共享資源。
Vxworks[2~8]是一個運行在目標(biāo)機上的高性能、可裁減的嵌入式實時操作系統(tǒng),Vxworks實時內(nèi)核—Wind提供了基本的多任務(wù)環(huán)境[9~10,13]。
多任務(wù)在單個處理器上構(gòu)造出多線程并發(fā)執(zhí)行的假象,實際上,系統(tǒng)內(nèi)核是根據(jù)某個調(diào)度算法交替執(zhí)行的。每個任務(wù)擁有各自的上下文,即擁有各自的CPU環(huán)境和系統(tǒng)資源,并保存在任務(wù)控制塊(TCB)中。
任務(wù)的上下文包括:
·任務(wù)的執(zhí)行點(任務(wù)的程序計數(shù)器);
·CPU中的寄存器和浮點寄存器;
·動態(tài)變量和函數(shù)調(diào)用所需的堆棧;
·I/O操作分配的標(biāo)準(zhǔn)輸入、輸出和標(biāo)準(zhǔn)錯誤輸出操作;
·一個延時定時器;
·一個時間片定時器;
·內(nèi)核控制結(jié)構(gòu);
·信號句柄;
·用于調(diào)試和性能監(jiān)視的值。
與其他操作系統(tǒng)一樣,任務(wù)執(zhí)行是首先必須建立任務(wù),激活任務(wù)。在Wind內(nèi)核中,默認(rèn)算法是基于優(yōu)先級的搶占式調(diào)度算法,但在優(yōu)先級相同情況下,可使用輪轉(zhuǎn)調(diào)度算法,任務(wù)間一般用訪問共享數(shù)據(jù)結(jié)構(gòu)、消息隊列等,在Vxworks中信號量被高度優(yōu)化,并提供了最快的任務(wù)間通信機制。信號量是互斥和同步的最主要手段。在Vxworks實時處理系統(tǒng)中各任務(wù)間互斥和同步是至關(guān)重要的,以一個發(fā)射機發(fā)射與綜合處理機狀態(tài)查詢兩個任務(wù)為例進行說明。
具體工作過程為發(fā)射機接收綜合處理機發(fā)射命令,發(fā)射一定時間信號,同時另一個任務(wù)綜合處理機以一定周期進行狀態(tài)查詢,如兩個任務(wù)工作正常時時序見圖2。
圖2 工作時序圖
但由于綜合處理機控制軟件不一定同步,有可能使“狀態(tài)查詢命令”的實時發(fā)射時間落在“禁止綜合處理機發(fā)送命令”期間,則造成的結(jié)果是綜合處理機控制已向接口(綜合處理機內(nèi)一個接口管理CPU)發(fā)送了“狀態(tài)查詢命令”,但接口控制模塊由于發(fā)射機的禁止發(fā)送而將命令丟棄,從而使發(fā)了“狀態(tài)查詢命令”,但收不到發(fā)射機的“狀態(tài)信息”并處于等待狀態(tài),一旦超過設(shè)定時間限制,綜合處理機會判發(fā)射機故障,造成虛報。為此若增加一個同步、互斥量就可避免此現(xiàn)象,即在定時查詢時在一個周期內(nèi)將發(fā)射啟動至發(fā)射結(jié)束這一期間提出,并在兩個任務(wù)之間加一個握手,在發(fā)射任務(wù)內(nèi)設(shè)置一個信息表示正在發(fā)射,排斥其他任務(wù)查詢發(fā)射狀態(tài),等到該信息量清空時,其他時間內(nèi)仍可定期查詢,當(dāng)然,除此方法外,還有其他辦法,在此舉例只是為了說明Vxworks下同步與互斥的重要性。
在Vxworks中實時大流量命令控制及處理任務(wù)并行,尤其是許多設(shè)備響應(yīng)時間不一時,共享數(shù)據(jù)的棧緩存的控制也很重要,以綜合處理機的命令接收、命令處理兩個并發(fā)任務(wù)為例進行說明。其中:
·命令接收任務(wù)完成操控臺不斷發(fā)來的命令,并緩存進棧;
·命令處理任務(wù)完成從共享棧中取出命令,并進行命令分類、響應(yīng);
·狀態(tài)查詢?nèi)蝿?wù)完成中央控制件對外各設(shè)備狀態(tài)查詢。
設(shè)棧長度為64,則綜合處理機用接收任務(wù)接收命令并將IP指針加1,命令處理任務(wù)讀走一條命令響應(yīng),IP減1,但由于兩個任務(wù)公用一個棧,而且任務(wù)間處理速度相差較大,棧的管理算法很有講究,對棧的操作同樣有一個同步與互斥問題,在實際實時系統(tǒng)中往往由于同步與互斥沒處理好,使得命令處理任務(wù)讀出了無效命令即部分命令參數(shù)被命令接收任務(wù)所修改,在對??张c滿處理上也很容易發(fā)生誤判,導(dǎo)致實時系統(tǒng)工作效率低,易造成接口間死機。
此外,在Vxworks下許多實時信號處理系統(tǒng)中處理機一般都通過VME總線對多塊DSP板共享內(nèi)存進行訪問,如圖3所示。
圖3 DSP與主控數(shù)據(jù)交換示意圖
如果RAM中數(shù)據(jù)格式示意如圖4:
圖4 RAM中數(shù)據(jù)格式示意圖
從圖4中可以發(fā)現(xiàn),處理機的主控與DSP板之間的數(shù)據(jù)交換最好采用軟握手同步方式,由于主控是一個多任務(wù)系統(tǒng),DSP板也是多CPU的處理,工作流程正常情況下按常規(guī)DSP寫數(shù),主控然后去讀數(shù)一般是不會有問題,這可以通過信號處理算法及硬件速度進行設(shè)定,但當(dāng)主控流程或DSP處理流程受其他接口、任務(wù)干擾后,DSP與主控之間的數(shù)據(jù)交換時序易“錯位”,從而使主控讀不到傳送數(shù)據(jù)有效標(biāo)志,也就不會去讀RAM上畫面顯示數(shù)據(jù),如果在DSP和主控之間增加一個軟握手信號,即DSP在數(shù)據(jù)寫入時增加判斷主控標(biāo)志是否為0,為0則可寫入,為1時就進行等待,主控讀出時判斷DSP標(biāo)志是否為0,0時表示數(shù)據(jù)可從RAM讀出。
Vxworks是目前較流行的一種嵌入式操作系統(tǒng),在此環(huán)境下進行多任務(wù)系統(tǒng)開發(fā),不但有一般多任務(wù)系統(tǒng)的共性,還有其特殊性,本文用工作中實際例子加以說明任務(wù)間同步和共享管理,起一個拋磚引玉作用。
[1]陳國良.并行計算結(jié)構(gòu)、算法、編程[M].北京:高等教育出版社,1999.
[2]李方敏.Vxworks高級程序設(shè)計[M].北京:清華大學(xué)出版社,2004.
[3]羅國慶.Vxworks與嵌入式軟件開發(fā)[M].北京:機械工業(yè)出版社,2003.
[4]陳育智,溫彥軍,陳琪.Vxworks程序開發(fā)實踐[M].北京:人民郵電出版社,2004.
[5]李方敏.Vxworks高級程序設(shè)計[M].北京:清華大學(xué)出版社,2004.
[6]周啟平,張揚.Vxworks程序員速查手冊[M].北京:機械工業(yè)出版社,2005.
[7]WindRiver.Vxworks Kernel Programmer’s Guide.6.8.USA:WindRiver Systems,Inc,2009.
[8]WindRiver.Vxworks Application Programmer’s Guide.6.8.USA:WindRiver Systems,Inc,2009.
[9]WindRiver.Vxworks WorkBench User’s Guide.3.2.USA:WindRiver Systems,Inc,2009.
[10]WindRiver.Vxworks WorkBench Host Shell User’s Guide.3.2.USA:WindRiver Systems,Inc.2009.
[11]唐力強,王行祥.嵌入式VxWorks系統(tǒng)下的CPCI設(shè)備驅(qū)動程序開發(fā)[J].計算機與數(shù)字工程,2011,39(1).
[12]胡俊.基于VxWorks操作系統(tǒng)的WindML圖形操控界面實現(xiàn)方法[J].計算機與數(shù)字工程,2011,39(11).
[13]孔祥營,柏桂枝.嵌入式實時操作系統(tǒng)Vxworks及其開發(fā)環(huán)境Tornado[M].北京:中國電力出版社,2002.