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