朱輝慶
(海軍駐杭州地區軍事代表室 杭州 310012)
并行[1]是一種自然現象。在現實世界中,任何時候都會有許多事件同時發生。當設計軟件以監測和控制現實世界中的系統時,就必須處理這種自然的并行。此外并行處理可提高處理速度、提高系統的可控性。但當處理軟件系統中的并行問題時,常常有兩個非常重要的方面:能夠檢測并響應以任意順序出現的外部事件;確保在要求的最短時間內作出響應。
如果各個并行活動獨立進行(即以完全平行的方式進行),問題就相對簡單:只需建立單獨的程序來處理每項活動。設計并行系統之所以困難,主要是由并行活動之間的交互造成的。當并行活動進行交互時,共享資源需要加以控制和協調。
公路交通系統可作為一種形象的類比。不同道路上的平行車流基本上不會相互影響,所以很少產生問題。相鄰車道上的平行車流為了交互時的安全,需要作一些協調。而在十字路口則會發生非常劇烈的交互,在這里需要進行周密的協調。因此,許多實時軟件系統都必須“反應靈敏”,而且可能在任意時間以任意順序產生、執行。

圖1 公路交通系統
但并行軟件它有許多困難,大多數計算機和編程語言從發明之日起就屬于順序設計。一個過程或處理器在某一時刻只執行一條指令。而很多中小系統只有一個處理器,在單個順序處理器中,必須通過交替執行不同任務來造成并行的假象。困難并不在其技術細節上,而在于決定何時和如何交替執行可能交互的程序段。
對于多個處理器,并行雖然很容易實現,但是交互情況卻變得更加復雜。首先,運行于不同處理器上的各項任務之間的通信就存在問題。由于通常要涉及到軟件的若干層次,因而會增加復雜性和定時開支。由于時鐘和定時有可能不同,而各構件又可能會分別發生故障,所以多CPU系統的確定性也會有所降低。
要支持并行,系統必須提供多個控制線程。控制線程的抽象可由軟件和硬件通過多種方式來實施。最常用的機制為以下某種機制的變形即多處理、多任務、基于應用程序的解決方案。當操作系統提供多任務時,常見的并行單元為進程。各進程可能有三種狀態:1)阻塞―等待接收某一輸入或獲得某一資源的控制權;2)就緒― 等待操作系統安排它執行;3)運行―實際使用CPU。
此外,通常會給進程分配相對的優先級。操作系統內核根據進程的狀態、優先級以及某種調度策略來確定在任一給定時刻應當運行哪一個進程。實際上,多任務操作系統在其所有進程中共享一個控制線程,爭用共享資源。
Vxworks[2~8]是一個運行在目標機上的高性能、可裁減的嵌入式實時操作系統,Vxworks實時內核—Wind提供了基本的多任務環境[9~10,13]。
多任務在單個處理器上構造出多線程并發執行的假象,實際上,系統內核是根據某個調度算法交替執行的。每個任務擁有各自的上下文,即擁有各自的CPU環境和系統資源,并保存在任務控制塊(TCB)中。
任務的上下文包括:
·任務的執行點(任務的程序計數器);
·CPU中的寄存器和浮點寄存器;
·動態變量和函數調用所需的堆棧;
·I/O操作分配的標準輸入、輸出和標準錯誤輸出操作;
·一個延時定時器;
·一個時間片定時器;
·內核控制結構;
·信號句柄;
·用于調試和性能監視的值。
與其他操作系統一樣,任務執行是首先必須建立任務,激活任務。在Wind內核中,默認算法是基于優先級的搶占式調度算法,但在優先級相同情況下,可使用輪轉調度算法,任務間一般用訪問共享數據結構、消息隊列等,在Vxworks中信號量被高度優化,并提供了最快的任務間通信機制。信號量是互斥和同步的最主要手段。在Vxworks實時處理系統中各任務間互斥和同步是至關重要的,以一個發射機發射與綜合處理機狀態查詢兩個任務為例進行說明。
具體工作過程為發射機接收綜合處理機發射命令,發射一定時間信號,同時另一個任務綜合處理機以一定周期進行狀態查詢,如兩個任務工作正常時時序見圖2。

圖2 工作時序圖
但由于綜合處理機控制軟件不一定同步,有可能使“狀態查詢命令”的實時發射時間落在“禁止綜合處理機發送命令”期間,則造成的結果是綜合處理機控制已向接口(綜合處理機內一個接口管理CPU)發送了“狀態查詢命令”,但接口控制模塊由于發射機的禁止發送而將命令丟棄,從而使發了“狀態查詢命令”,但收不到發射機的“狀態信息”并處于等待狀態,一旦超過設定時間限制,綜合處理機會判發射機故障,造成虛報。為此若增加一個同步、互斥量就可避免此現象,即在定時查詢時在一個周期內將發射啟動至發射結束這一期間提出,并在兩個任務之間加一個握手,在發射任務內設置一個信息表示正在發射,排斥其他任務查詢發射狀態,等到該信息量清空時,其他時間內仍可定期查詢,當然,除此方法外,還有其他辦法,在此舉例只是為了說明Vxworks下同步與互斥的重要性。
在Vxworks中實時大流量命令控制及處理任務并行,尤其是許多設備響應時間不一時,共享數據的棧緩存的控制也很重要,以綜合處理機的命令接收、命令處理兩個并發任務為例進行說明。其中:
·命令接收任務完成操控臺不斷發來的命令,并緩存進棧;
·命令處理任務完成從共享棧中取出命令,并進行命令分類、響應;
·狀態查詢任務完成中央控制件對外各設備狀態查詢。
設棧長度為64,則綜合處理機用接收任務接收命令并將IP指針加1,命令處理任務讀走一條命令響應,IP減1,但由于兩個任務公用一個棧,而且任務間處理速度相差較大,棧的管理算法很有講究,對棧的操作同樣有一個同步與互斥問題,在實際實時系統中往往由于同步與互斥沒處理好,使得命令處理任務讀出了無效命令即部分命令參數被命令接收任務所修改,在對棧空與滿處理上也很容易發生誤判,導致實時系統工作效率低,易造成接口間死機。
此外,在Vxworks下許多實時信號處理系統中處理機一般都通過VME總線對多塊DSP板共享內存進行訪問,如圖3所示。

圖3 DSP與主控數據交換示意圖
如果RAM中數據格式示意如圖4:

圖4 RAM中數據格式示意圖
從圖4中可以發現,處理機的主控與DSP板之間的數據交換最好采用軟握手同步方式,由于主控是一個多任務系統,DSP板也是多CPU的處理,工作流程正常情況下按常規DSP寫數,主控然后去讀數一般是不會有問題,這可以通過信號處理算法及硬件速度進行設定,但當主控流程或DSP處理流程受其他接口、任務干擾后,DSP與主控之間的數據交換時序易“錯位”,從而使主控讀不到傳送數據有效標志,也就不會去讀RAM上畫面顯示數據,如果在DSP和主控之間增加一個軟握手信號,即DSP在數據寫入時增加判斷主控標志是否為0,為0則可寫入,為1時就進行等待,主控讀出時判斷DSP標志是否為0,0時表示數據可從RAM讀出。
Vxworks是目前較流行的一種嵌入式操作系統,在此環境下進行多任務系統開發,不但有一般多任務系統的共性,還有其特殊性,本文用工作中實際例子加以說明任務間同步和共享管理,起一個拋磚引玉作用。
[1]陳國良.并行計算結構、算法、編程[M].北京:高等教育出版社,1999.
[2]李方敏.Vxworks高級程序設計[M].北京:清華大學出版社,2004.
[3]羅國慶.Vxworks與嵌入式軟件開發[M].北京:機械工業出版社,2003.
[4]陳育智,溫彥軍,陳琪.Vxworks程序開發實踐[M].北京:人民郵電出版社,2004.
[5]李方敏.Vxworks高級程序設計[M].北京:清華大學出版社,2004.
[6]周啟平,張揚.Vxworks程序員速查手冊[M].北京:機械工業出版社,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系統下的CPCI設備驅動程序開發[J].計算機與數字工程,2011,39(1).
[12]胡俊.基于VxWorks操作系統的WindML圖形操控界面實現方法[J].計算機與數字工程,2011,39(11).
[13]孔祥營,柏桂枝.嵌入式實時操作系統Vxworks及其開發環境Tornado[M].北京:中國電力出版社,2002.