南京科瑞達電子裝備有限責(zé)任公司 江蘇 南京 211100
隨著芯片制造工藝的持續(xù)進步和計算機技術(shù)的快速發(fā)展,嵌入式操作系統(tǒng)作為信息社會很重要的基礎(chǔ)支撐已被廣泛用于各類電子設(shè)備中,并發(fā)揮了極其重要的作用。嵌入式實時操作系統(tǒng)是一類特殊的嵌入式操作系統(tǒng),它能夠在外界事件或數(shù)據(jù)產(chǎn)生時迅速反應(yīng),并以足夠快的速度處理事件,以保證系統(tǒng)能夠在確定的時間內(nèi)對處理結(jié)果做出快速響應(yīng),同時控制所有實時任務(wù)協(xié)調(diào)一致運行。目前在工業(yè)控制、軍事設(shè)備、航空航天等對系統(tǒng)響應(yīng)時間有嚴苛要求的領(lǐng)域中都有著非常廣泛的應(yīng)用。
在一個中大型嵌入式軟件應(yīng)用中,通常需要建立一個復(fù)雜的多任務(wù)環(huán)境,系統(tǒng)運行時通過任務(wù)間交換消息來實現(xiàn)某些特定的系統(tǒng)功能。在這些任務(wù)信息交互過程中,普遍存在一個任務(wù)往多個任務(wù)發(fā)送消息的場景,同時也存在某一個任務(wù)會接收來自多個其他任務(wù)發(fā)送過來的消息的場景。這些任務(wù)間數(shù)據(jù)通信交錯復(fù)雜,并且任務(wù)間通信的數(shù)據(jù)長度各不相同。因此需要研究一種高效的、實時的、通信數(shù)據(jù)可變長的,且無任何中轉(zhuǎn)機制的多任務(wù)間點對點的數(shù)據(jù)通信方法。
SylixOS操作系統(tǒng)是一種基于搶占式多任務(wù)硬實時操作系統(tǒng),兼容IEEE1003(ISO/IEC9945)操作系統(tǒng)接口規(guī)范,兼容POSIX 1003.1b(ISO/IEC 9945-1)實時編程的標準,具有優(yōu)秀的實時性能,能夠支持無限多任務(wù),搶占式調(diào)度支持256個任務(wù)優(yōu)先級,支持虛擬進程,支持優(yōu)先級繼承及防止優(yōu)先級反轉(zhuǎn)功能。同時支持二進制信號量、計數(shù)型信號量、互斥信號量、消息隊列等資源共享方式。由于兼容POSIX標準,同樣一個Linux下的符合POSIX標準的應(yīng)用程序,無須任何修改可以在SylixOS下完美運行。另外,VxWorks也是一款符合POSIX標準的實時操作系統(tǒng),因此,SylixOS可以使VxWorks開發(fā)者能夠很快地適應(yīng)SylixOS的程序開發(fā),并提供了VxWorks兼容接口。
SylixOS是一款大型嵌入式實時操作系統(tǒng),經(jīng)過多年開發(fā),目前已經(jīng)成為一個功能完善、性能卓越、可靠穩(wěn)定的嵌入式系統(tǒng)軟件開發(fā)平臺,在設(shè)計思路上借鑒了眾多實時操作系統(tǒng)的設(shè)計思想,使得SylixOS在功能和具體性能上達到或超過了眾多實時操作系統(tǒng)的水平,成為國內(nèi)實時操作系統(tǒng)的最優(yōu)秀代表之一,目前在工業(yè)自動化、軍事、通信、民用等領(lǐng)域都有較為廣泛的應(yīng)用[1]。
SylixOS作為大型實時操作系統(tǒng),支持的多任務(wù)間通信方式主要有以下幾種:共享內(nèi)存、信號量和消息隊列。同時為了實現(xiàn)多任務(wù)對臨界資源的互斥訪問,SylixOS也提供了很多種方法,主要包括讀寫鎖、條件變量、自旋鎖、原子量及信號量等。
在一個大型的嵌入式軟件應(yīng)用中,可能同時運行有十幾個甚至幾十個軟件任務(wù),并且任務(wù)之間的消息交互非常頻繁,通信的數(shù)據(jù)長度較大。共享內(nèi)存的方式需要開辟很大一個內(nèi)存空間來存儲中間數(shù)據(jù),同時需要對共享區(qū)域數(shù)據(jù)的讀寫操作做好互斥。一方面,雖然操作系統(tǒng)內(nèi)核提供了讀寫鎖、信號量等機制可以在一定條件下解決共享資源的互斥訪問問題,但是在一些任務(wù)間通信較為復(fù)雜的多任務(wù)環(huán)境中,勢必會引起數(shù)據(jù)發(fā)送端的任務(wù)大量排隊等待的現(xiàn)象,從而降低了系統(tǒng)的運行效率。另一方面,消息隊列機制雖然可以通過異步消息傳送模型來避免由于信號量引起的排隊問題,但是當任務(wù)數(shù)較多時,需要的消息隊列個數(shù)將會非常多,而且消息隊列中單個消息的數(shù)據(jù)長度將會要求很大,勢必會造成大量的系統(tǒng)內(nèi)存資源耗費。下面介紹的多任務(wù)間通信方法在克服這些問題方面有著一定的優(yōu)勢。
在SylixOS操作系統(tǒng)環(huán)境下,每一項系統(tǒng)功能的完成往往由多個任務(wù)或者多個任務(wù)與中斷服務(wù)程序共同完成。鑒于此,本文設(shè)計了一種新的任務(wù)間數(shù)據(jù)交互方式,采用的是點對點的消息機制,每個任務(wù)都有一個類似地址的代號(ID),發(fā)送的數(shù)據(jù)被封裝為一個消息,發(fā)送消息的任務(wù)(信源)指定接收消息任務(wù)(信宿)的代號后將消息發(fā)出,可以直接通過互斥信號量保護機制將數(shù)據(jù)壓入到信宿的環(huán)形隊列中,再計數(shù)信號量同步機制由消息接收任務(wù)進行數(shù)據(jù)處理。
第一步,由于任務(wù)間通信的消息長度和內(nèi)容都是用戶自己定義,可以是數(shù)據(jù)、指令或指針等,因此,我們在創(chuàng)建每一個任務(wù)時,需要創(chuàng)建一個與之關(guān)聯(lián)的用于存儲消息的環(huán)形隊列,環(huán)形隊列緩沖區(qū)總大小由用戶根據(jù)實際任務(wù)交互的消息大小和數(shù)量來確定,環(huán)形隊列的結(jié)構(gòu)如下圖 1所示。同時為保證任務(wù)間通信時的同步與互斥,需要分別創(chuàng)建一個與任務(wù)相關(guān)聯(lián)的二進制信號量與計數(shù)信號量[2]。

圖1 任務(wù)的環(huán)形隊列示意圖
每個任務(wù)的環(huán)形隊列和信號量的創(chuàng)建過程如下:


以上程序段在系統(tǒng)中創(chuàng)建并啟動Task1、Task2、Task3,Task1建立一個緩存大小為RNG_SIZE1的環(huán)形隊列,同時創(chuàng)建一個二進制信號量和一個計數(shù)信號量,名稱分別為“semB1”和“semC1”。Task2建立一個緩存大小為RNG_SIZE2的環(huán)形隊列,同時創(chuàng)建一個二進制信號量和一個計數(shù)信號量,名稱分別為“semB2”和“semC2”。Task3建立一個緩存大小為RNG_SIZE3的環(huán)形隊列,同時創(chuàng)建一個二進制信號量和一個計數(shù)信號量,名稱分別為“semB3”和“semC3”。
第二步,需要發(fā)送消息的任務(wù)將消息送入接收任務(wù)的消息環(huán)形隊列中。消息發(fā)送任務(wù)對需要發(fā)送的數(shù)據(jù)進行消息頭封裝,消息結(jié)構(gòu)如下表 1所示。在發(fā)送數(shù)據(jù)時,根據(jù)接收方ID獲取接收任務(wù)ID,然后發(fā)送任務(wù)直接將數(shù)據(jù)消息壓入接收任務(wù)的環(huán)形隊列中,同時釋放同步信號量[3]。任務(wù)消息發(fā)送處理流程圖如下圖 2所示:

表1 任務(wù)間通信消息結(jié)構(gòu)表

表2 消息控制字定義表

圖2 任務(wù)消息發(fā)送處理流程圖
第三步,消息接收任務(wù)獲取同步信號量之后首先讀取消息長度,然后根據(jù)消息長度讀取環(huán)形隊列緩沖區(qū)的消息內(nèi)容進行相對應(yīng)的處理[4]。任務(wù)消息接收處理流程圖如下圖3所示:

圖3 任務(wù)消息接收處理流程圖
在CSP2020雙核處理器上,創(chuàng)建一個基于SylixOS的軟件應(yīng)用。按照上述任務(wù)間數(shù)據(jù)通信的方法,應(yīng)用中分別創(chuàng)建并激活三個軟件任務(wù),任務(wù)名分別為Task1、Task2、Task3。測試三個任務(wù)之間互相發(fā)送和接收不同數(shù)據(jù)長度(128字節(jié)、1K字節(jié)、4K字節(jié))的消息(消息格式按照上述表1進行封裝),分別測試1000次,最后計算得到數(shù)據(jù)從發(fā)送到成功接收的最大時間、最小時間和平均時間[5]。測試結(jié)果如下所示:

上述基于SylixOS的多任務(wù)間數(shù)據(jù)通信方法,解決了大型復(fù)雜嵌入式系統(tǒng)中任務(wù)間一對多、多對一的數(shù)據(jù)通信問題,滿足其對于嵌入式實時操作系統(tǒng)中多任務(wù)間通信效率高、實時性強、通信數(shù)據(jù)可變長等要求,目前該方法已經(jīng)在某型電子對抗裝備應(yīng)用軟件中得到了成功的應(yīng)用。