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