構(gòu)建在中小規(guī)模CPU上的實(shí)時(shí)UML框架程序設(shè)計(jì)環(huán)境
通過(guò)狀態(tài)機(jī)部件、基礎(chǔ)框架、任務(wù)管理內(nèi)核和跟蹤調(diào)試器的移植證明了這種平臺(tái)在中小型CPU上運(yùn)行的可行性、便捷性和高可靠性等優(yōu)點(diǎn)。最后,通過(guò)航天相機(jī)控制器應(yīng)用程序設(shè)計(jì)實(shí)例中各個(gè)任務(wù)線程的執(zhí)行時(shí)間測(cè)量結(jié)果及可調(diào)度結(jié)果進(jìn)一步驗(yàn)證了該平臺(tái)的實(shí)用性。
0 引言
隨著高級(jí)編程語(yǔ)言和操作系統(tǒng)在越來(lái)越多種類的CPU構(gòu)架上的應(yīng)用,系統(tǒng)應(yīng)用程序變得越來(lái)越大,越來(lái)越復(fù)雜。并且實(shí)際應(yīng)用大多對(duì)于程序的設(shè)計(jì)周期、可靠性都具有很高的要求。基于傳統(tǒng)的嵌入式實(shí)時(shí)操作系統(tǒng)的軟件設(shè)計(jì),雖然可使程序的實(shí)時(shí)性能得到提高,但是并行程序設(shè)計(jì)過(guò)程中存在著更多的競(jìng)爭(zhēng)狀態(tài),而且這些競(jìng)爭(zhēng)狀態(tài)極難被發(fā)現(xiàn)。如何能夠找到一種符合軟件工程學(xué)的程序設(shè)計(jì)方法成為每個(gè)嵌入式軟件工程師所面臨的問題。
傳統(tǒng)的實(shí)時(shí)操作系統(tǒng)雖然可以完成任務(wù)管理,但是往往代碼量較大,任務(wù)切換要求復(fù)雜,完全摒棄編譯器提供的程序調(diào)用機(jī)制,采用任務(wù)堆棧機(jī)制,接口程序設(shè)計(jì)要求高,實(shí)現(xiàn)任務(wù)切換時(shí)占用資源較大,不適合應(yīng)用于8位和16位總線構(gòu)架的CPU上。
另一方面,基于UML 的實(shí)時(shí)框架程序設(shè)計(jì)方法對(duì)于當(dāng)今的高復(fù)雜性、短開發(fā)周期的商業(yè)環(huán)境來(lái)說(shuō)變得越來(lái)越重要。主要是因?yàn)閁ML 語(yǔ)言是可執(zhí)行的,所以根據(jù)UML 建立的系統(tǒng)行為模型可以生成可執(zhí)行代碼,從而節(jié)約了從抽象模型到手工編寫可執(zhí)行代碼的費(fèi)時(shí)、費(fèi)力的工作量。但是所有的UML 代碼生成工具是為類似PC上應(yīng)用而設(shè)計(jì)的,不適合應(yīng)用于中小型的CPU,且售價(jià)昂貴。
如果將RTOS的實(shí)時(shí)性與UML模型設(shè)計(jì)的直觀性、安全性和便捷性相結(jié)合,應(yīng)用于中小規(guī)模的CPU 芯片無(wú)疑會(huì)給深度嵌入式系統(tǒng)開發(fā)帶來(lái)更多的手段。
1 實(shí)時(shí)UML 框架程序設(shè)計(jì)平臺(tái)(QP)簡(jiǎn)介
QP是使用實(shí)時(shí)搶占式任務(wù)管理內(nèi)核、基于UML狀態(tài)圖的軟件設(shè)計(jì)方法的輕量級(jí)軟件平臺(tái),是一種新式操作系統(tǒng)。QP軟件平臺(tái)結(jié)構(gòu)如圖1所示由以下4個(gè)部件組成。
1.1 任務(wù)管理內(nèi)核(QK)
QK也采用了類似其他商業(yè)內(nèi)核的優(yōu)先級(jí)的搶占機(jī)制以保證關(guān)鍵任務(wù)得到實(shí)時(shí)執(zhí)行。但是QK 實(shí)現(xiàn)搶占的原理有別于任何一種操作系統(tǒng)。QK采用的是Moore狀態(tài)機(jī)的“運(yùn)行到結(jié)束”的機(jī)制,因此當(dāng)系統(tǒng)還在忙于處理前較低優(yōu)先級(jí)事件時(shí),當(dāng)較高優(yōu)先級(jí)的事件到來(lái)時(shí),系統(tǒng)將新事件存儲(chǔ)在消息隊(duì)列中,直到低優(yōu)先級(jí)事件完成后,再執(zhí)行新事件。QK 的實(shí)現(xiàn)原理不同于傳統(tǒng)RTOS的堆棧操作,僅使用C 語(yǔ)言編譯器的中斷服務(wù)程序(ISR)機(jī)制就可完成。也就是QK的移植完全不需要插入額外的匯編語(yǔ)句。所以,任務(wù)切換時(shí)沒有額外的開銷,執(zhí)行速度快,相當(dāng)于子程序調(diào)用。當(dāng)然如果使用其他RTOS 的任務(wù)管理功能也能代替QK,稍候在QP 到TMS320LF2407的接口程序設(shè)計(jì)部分介紹。
1.2 基礎(chǔ)框架平臺(tái)
該框架平臺(tái)完成了驅(qū)動(dòng)事件管理功能、狀態(tài)機(jī)架構(gòu)管理和實(shí)時(shí)任務(wù)管理功能。
實(shí)時(shí)UML框架序設(shè)計(jì)平臺(tái)(QF)中任務(wù)是由能實(shí)現(xiàn)輕量級(jí)UML狀態(tài)機(jī)和用來(lái)接收觸發(fā)事件的消息隊(duì)列組成。因此基于實(shí)時(shí)UML框架的任務(wù)具有UML狀態(tài)機(jī)的特點(diǎn)。QF 將任務(wù)分為激活狀態(tài)和休眠狀態(tài),QF 根據(jù)觸發(fā)事件和任務(wù)優(yōu)先級(jí)對(duì)其進(jìn)行管理。實(shí)際工作時(shí)任務(wù)間采用異步的事件發(fā)送和接收機(jī)制進(jìn)行通信。任務(wù)使用消息隊(duì)列接收其他活動(dòng)對(duì)象的事件消息;同時(shí),不同任務(wù)產(chǎn)生的事件也會(huì)利QF投送給其他訂閱該消息的任務(wù)。對(duì)于觸發(fā)事件的交換,排隊(duì),收集,銷毀等工作則由QF統(tǒng)一完成??梢?,任務(wù)間通過(guò)QF框架進(jìn)行間接通信,實(shí)現(xiàn)了事件松耦合。因此,基于QF的程序設(shè)計(jì)可以采用模塊化的設(shè)計(jì)方法,給設(shè)計(jì)過(guò)程中方案的修改和設(shè)計(jì)后期的軟件維護(hù)提供了極大的方便。正像使用UML 的自動(dòng)設(shè)計(jì)工具軟件進(jìn)行程序設(shè)計(jì)的過(guò)程一樣,使用QF的程序設(shè)計(jì)也遵循以下過(guò)程:使用UML語(yǔ)義進(jìn)行模型設(shè)計(jì),根據(jù)QP平臺(tái)代碼轉(zhuǎn)換方法將UML模型轉(zhuǎn)化為源代碼。
總之,基于QF的程序設(shè)計(jì)實(shí)現(xiàn)了可視化程序設(shè)計(jì)和“自動(dòng)”代碼生成的目的;另外,在嵌入式系統(tǒng)中也可以將QF當(dāng)作為一個(gè)軟件總線,將QF的接口移植到其他OS之上,以隱藏下層硬件和軟件的差異。
1.3 狀態(tài)機(jī)部件(QEP)
上節(jié)提到的QF任務(wù)的狀態(tài)機(jī)的特性是由狀態(tài)機(jī)部件(QEP)完成的。QEP是一個(gè)簡(jiǎn)化的輕量級(jí)的UML狀態(tài)機(jī)部件,實(shí)現(xiàn)了狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換觸發(fā)事件響應(yīng)等功能。QEP提供了兩種狀態(tài)機(jī)類型:層次化狀態(tài)機(jī)(HSM)和平面狀態(tài)機(jī)(FSM)。
1.4 跟蹤調(diào)試器(QSPY)
QSPY 使用緩存機(jī)制采集系統(tǒng)內(nèi)運(yùn)行狀態(tài),事后在空閑任務(wù)時(shí)再編碼輸出,再有在整個(gè)QP 平臺(tái)中QSPY調(diào)試插件有機(jī)的與系統(tǒng)關(guān)鍵運(yùn)行環(huán)節(jié)有機(jī)的結(jié)合在一起,因此基于QSPY的調(diào)試可以獲得更多的系統(tǒng)的信息的同時(shí)又不會(huì)過(guò)多地干擾程序的正常運(yùn)行。在這一點(diǎn)上比傳統(tǒng)RTOS中的跟蹤調(diào)試器更領(lǐng)先一步。
2 QP 到TMS320LF2407 的接口移植
QP存在C和C++版本?;贑語(yǔ)言版本的精簡(jiǎn)版QP平臺(tái)的代碼量可以在4 KB左右,可以輕易的放入到大多數(shù)的小規(guī)模CPU的片上存儲(chǔ)器中。并且該平臺(tái)的實(shí)現(xiàn)原理如上節(jié)所述可以使用C編譯器實(shí)現(xiàn)[4],因此移植工作量極少,僅需幾十行的C語(yǔ)言程序就可完成。顯然在諸如TMS320LF2407 的中小型的CPU 上更適合使用基于C 的版本。QP 移植主要的工作集中在改寫qep_port.h,qf_port.h,qf_port.c,qk_port.h 和qs_port.h 這4 個(gè)文件。
2.1 QEP的接口移植
QEP 完成了狀態(tài)機(jī)的實(shí)現(xiàn)機(jī)制。配置和移植QEP需修改qep_port.h頭文件中關(guān)于各種數(shù)據(jù)類型和主要參數(shù)的定義。其中主要的有Q_ROM,Q_ROM_VAR 和QEP_SIGNAL_SIZE 三個(gè)宏定義。Q_ROM 宏是用來(lái)定義常變量到程序存儲(chǔ)區(qū)域的,比如使用較大的表或數(shù)組等常數(shù)時(shí)不希望占用RAM資源時(shí),將其定義在程序區(qū),可以使用Q_ROM宏。定義方法根據(jù)不同的編譯器而不同,比如在Keil C51 中Q_ROM 被定義為code 關(guān)鍵字。
Q_ROM_VAR 宏用來(lái)定義如何采用指針類型取程序存儲(chǔ)器變量。QEP_SIGNAL_SIZE 宏用來(lái)定義信號(hào)寬度,通常為1,2或4.針對(duì)TMS320LF2407的硬件結(jié)構(gòu)特點(diǎn)定義了8位、16位和32位有符號(hào)和無(wú)符號(hào)數(shù)的類型。
2.2 QF的接口移植
QF 的移植主要集中在對(duì)于狀態(tài)機(jī)和任務(wù)管理方面。在qf_port.h 中根據(jù)實(shí)際的軟件需求修改狀態(tài)機(jī)實(shí)現(xiàn)相關(guān)的定義,例如觸發(fā)事件的類型、事件隊(duì)列的深度和事件緩存的容量。QF中事件初始位置存放在事件緩存區(qū)中,所有的任務(wù)間的事件傳遞使用指針方式進(jìn)行,從而有效地減少了事件傳遞對(duì)內(nèi)存的開銷。任務(wù)管理方面定義了最大任務(wù)數(shù)、中斷嵌套相關(guān)的定義以及任務(wù)切換的機(jī)制。
在pf_port.c中需要編寫有關(guān)諸如QF平臺(tái)開始和退出代碼,如無(wú)特殊需要這些函數(shù)可以使用空函數(shù)代替。
QP平臺(tái)中對(duì)于程序的運(yùn)行關(guān)鍵位置使用了斷言手段進(jìn)行約束,在平臺(tái)運(yùn)行異常時(shí)會(huì)給出診斷信息。在pf_port.c 的Q_assert_handler()函數(shù)可以返回平臺(tái)錯(cuò)誤信息。
2.3 QK的接口移植
QP平臺(tái)的任務(wù)調(diào)度機(jī)制在QK中完成。因此QK的移植需要根據(jù)TMS320LF2407 的編譯工具進(jìn)行接口函數(shù)的設(shè)計(jì)。所有調(diào)度相關(guān)的定義在qk_port.h 頭文件中。其中主要的是中斷相關(guān)的定義,如:開關(guān)中斷的機(jī)制和中斷響應(yīng)程序的進(jìn)入和退出機(jī)制等。
QK 中使用QK_INT_KEY_TYPE,QK_INT_LOCK(key_),QK_INT_UNLOCK(key_)三個(gè)宏接口定義了中斷開關(guān)機(jī)制。其中QK_INT_KEY_TYPE 定義了中斷嵌套時(shí)中斷優(yōu)先級(jí)傳遞參量類型。QK_INT_LOCK(key_)定義了關(guān)中斷的機(jī)制,QK_INT_UNLOCK(key_)定義了開中斷的機(jī)制。在TMS320LF 因?yàn)樵赥MS320LF2407 的C 編譯器中沒有直接對(duì)ST0、ST1 寄存器進(jìn)行操作的方法,此處使用嵌入?yún)R編實(shí)現(xiàn)中斷使能和中斷禁止功能。還有,在TMS320LF2407 中具有中斷優(yōu)先級(jí)管理器,因此中斷傳遞參數(shù)類別QK_INT_KEY_TYPE在本移植中不用定義。
QP 中中斷服務(wù)程序相當(dāng)于最高優(yōu)先級(jí)的任務(wù),因此中斷的進(jìn)入動(dòng)作QK_ISR_ENTRY()和退出動(dòng)作QK_ISR_EXIT()需要特殊規(guī)定:QK_ISR_ENTRY(pin,ISR_PRIO):首先是,將當(dāng)前QK 優(yōu)先級(jí)保存到變量pin上;然后將當(dāng)前QK的優(yōu)先級(jí)ISR_PRIO改變?yōu)樽罡邇?yōu)先級(jí)別;最后使能中斷。QK_ISR_EXIT(pin)中斷服務(wù)程序退出動(dòng)作的過(guò)程是:關(guān)中斷,清中斷寄存器結(jié)束中斷標(biāo)記,從變量pin中恢復(fù)以前的優(yōu)先級(jí),調(diào)用QK的任務(wù)切換函數(shù)進(jìn)行任務(wù)調(diào)度。
需要注意,TMS320LF2407 中斷有2 種類型:一種由事件管理模塊管理,不需要使用程序清中斷標(biāo)志位,如定時(shí)器,計(jì)數(shù)器,PWM 等設(shè)備;另一種需要任務(wù)清中斷標(biāo)記,如串行外設(shè)接口(SPI)、串行通信接口(SCI)、CAN 總線等。所以在中斷退出時(shí)需要分別處理,一般在BSP中進(jìn)行。[!--empirenews.page--]
2.4 QS 的接口移植
QS 完成了軟件系統(tǒng)運(yùn)行信息的收集和輸出功能。
QS移植需要修改qs_port.h文件。其中定義了系統(tǒng)信息緩存區(qū)的深度,定義了在空閑時(shí)系統(tǒng)信息的輸出方式等。
3 基于QP 的航天相機(jī)控制器控制軟件的實(shí)例通過(guò)上節(jié)所述的構(gòu)建過(guò)程QP 平臺(tái)被移植到了TMS320LF2407上,下面通過(guò)某航天相機(jī)控制器的控制軟件的設(shè)計(jì)實(shí)例說(shuō)明基于QP的軟件架構(gòu)設(shè)計(jì)過(guò)程和實(shí)際運(yùn)行結(jié)果。
3.1 基于QP的航天相機(jī)控制器的軟件設(shè)計(jì)
基于QP 平臺(tái)的軟件設(shè)計(jì)過(guò)程完全采用UML 的圖形可視化方法。使用用例圖分析軟件任務(wù)、需求。使用類圖描述軟件架構(gòu)。使用活動(dòng)圖或順序圖描述軟件結(jié)構(gòu)中的對(duì)象間的消息交換細(xì)節(jié)。使用順序圖與狀態(tài)圖描述軟件系統(tǒng)對(duì)象間的行為轉(zhuǎn)換。如圖2中描述了航天相機(jī)控制器軟件總體架構(gòu)的狀態(tài)轉(zhuǎn)換圖。
其中分為4個(gè)狀態(tài),正常工作時(shí)系統(tǒng)在程控模式和正常模式間轉(zhuǎn)換,觸發(fā)信號(hào)為程控結(jié)束和E5.4 信號(hào)。
在正常模式內(nèi)部又有工況參數(shù)輪詢和攝像2種模式,通過(guò)相應(yīng)的觸發(fā)信號(hào)系統(tǒng)在兩種狀態(tài)間轉(zhuǎn)換。另外E5.1.1到E5.1.7信號(hào)為內(nèi)部轉(zhuǎn)換觸發(fā)信號(hào)。
3.2 軟件源程序的生成
在QP中有關(guān)狀態(tài)機(jī)的所有的要素,如狀態(tài)、層次狀態(tài)、狀態(tài)轉(zhuǎn)換、輸入事件觸發(fā)和輸出事件觸發(fā)均可以對(duì)應(yīng)為固定的源代碼,在將活動(dòng)對(duì)象轉(zhuǎn)化為源代碼時(shí)幾乎無(wú)需編程人員的參與。例如,對(duì)于狀態(tài)機(jī)中的狀態(tài),QP中使用帶有事件參數(shù)指針的函數(shù)來(lái)表示,其返回值指向另一個(gè)QP狀態(tài)。對(duì)于信號(hào)的傳遞采用指針消息隊(duì)列來(lái)表示。
3.3 控制器軟件的測(cè)試結(jié)果
由于使用了QS動(dòng)態(tài)調(diào)試手段,所以可以在最為接近全速運(yùn)行的狀態(tài)下收集軟件運(yùn)行信息。如圖3所示控制器采集模擬量工況參數(shù)場(chǎng)景的實(shí)測(cè)各個(gè)觸發(fā)事件發(fā)生的時(shí)間信息,時(shí)間刻度為1 μs.
如圖3中所示模擬量遙測(cè)任務(wù)在t1時(shí)刻執(zhí)行,采集系統(tǒng)內(nèi)的模擬量參數(shù)。采集完成后在t2時(shí)刻向系統(tǒng)“發(fā)布”數(shù)據(jù)信號(hào)量。在t4時(shí)刻“訂閱”了數(shù)據(jù)信號(hào)的數(shù)據(jù)合成任務(wù)得以執(zhí)行。在數(shù)據(jù)合成任務(wù)以某種方式對(duì)數(shù)據(jù)打包編碼后,在t5 時(shí)刻向系統(tǒng)“發(fā)布”打包后的數(shù)據(jù)消息。最后通訊任務(wù)在t6時(shí)刻,將打包數(shù)據(jù)通過(guò)數(shù)據(jù)鏈路輸出。對(duì)于模擬遙測(cè)任務(wù),t1 為任務(wù)執(zhí)行的起始時(shí)刻,t3 為任務(wù)結(jié)束時(shí)刻,任務(wù)執(zhí)行時(shí)間可由下面表達(dá)式(1)來(lái)描述。
根據(jù)上面的測(cè)量方法可以統(tǒng)計(jì)一個(gè)軟件運(yùn)行周期內(nèi)所有任務(wù)的執(zhí)行時(shí)間,下表是本相機(jī)控制器軟件在2 s的運(yùn)行周期內(nèi),常規(guī)工況下,所有任務(wù)執(zhí)行時(shí)間的統(tǒng)計(jì)結(jié)果。
通過(guò)上表可見,QP 平臺(tái)完成了軟件中各個(gè)任務(wù)的管理工作,但是QP 平臺(tái)對(duì)于系統(tǒng)資源的占用時(shí)間極少。另外采用速率單調(diào)調(diào)度[1](RMS)算法可以看到本應(yīng)用軟件是完全可調(diào)度系統(tǒng)。通過(guò)上面講述的工作后,證明整個(gè)系統(tǒng)已經(jīng)能夠正常運(yùn)行,移植成功。
4 結(jié)論
綜上,QP下的程序設(shè)計(jì)完全是基于可視化的UML狀態(tài)圖方式,因此提高了程序設(shè)計(jì)的效率,縮短了設(shè)計(jì)周期,并且減少了不確定的、無(wú)法預(yù)測(cè)的狀態(tài)從而加強(qiáng)了軟件的安全性;QP 的實(shí)現(xiàn)原理有別于傳統(tǒng)的RTOS,因此QP具有緊湊的代碼結(jié)構(gòu),代碼量小,QP的代碼量非常少,即使是在所有的功能都被使能的情況下也只有4 K左右[1],更適合于深度的嵌入式系統(tǒng)。
因此,在完成了QP 平臺(tái)在TMS320LF2407 上的構(gòu)建的同時(shí)也證明了基于實(shí)時(shí)UML狀態(tài)機(jī)的應(yīng)用軟件是完全可以在中小型CPU上運(yùn)行的。