《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于Simulink的OSEK嵌入式軟件開發(fā)方法
基于Simulink的OSEK嵌入式軟件開發(fā)方法
單片機與嵌入式系統(tǒng)應(yīng)用
同濟大學(xué) 張永博 沈勇
摘要: 目前越來越多的汽車電子系統(tǒng)的開發(fā)借助Matlab/Simulink,,并且其已變成標(biāo)準(zhǔn)的開發(fā)工具,。本文提出的軟件開發(fā)方法基于Sireulink環(huán)境和OSEK OS規(guī)范,。在Simulink環(huán)境下開發(fā)的算法可以結(jié)合OSEK RTOS(本文為修改過的μC/OS-II)直接應(yīng)用到目標(biāo)硬件上。該方法已通過實例進行了驗證,,與傳統(tǒng)方法比較極大地縮短了開發(fā)時間,。
Abstract:
Key words :
</a>Matlab" title="Matlab">Matlab" title="Matlab">Matlab/SimulinkOSEK實時操作系統(tǒng)規(guī)范已成為標(biāo)準(zhǔn)的開發(fā)平臺,,文章通過引入新的理念和方法將兩者相結(jié)合,。首先從分析軟件的架構(gòu)入手,,介紹了Simulink模型中的任務(wù)識別、定時機制,、基于μC/OS—II的OSEK順應(yīng)性開發(fā),,以及在Matlab環(huán)境下如何創(chuàng)建自定義的驅(qū)動庫等,最后通過應(yīng)用實例驗證了該開發(fā)方法的可行性,。
關(guān)鍵詞 嵌入式軟件開發(fā)代碼自動生成 Matlab/Simulink OSEK μC/OS-II


引 言
    現(xiàn)在V型開發(fā)模式已成為使用最廣的汽車軟件開發(fā)流程標(biāo)準(zhǔn),。這一標(biāo)準(zhǔn)流程得到許多工具的支撐,有來自Mathworks的工具,,如用于功能開發(fā)和仿真的Matlab/Simulink/Stateflow,,用于自動代碼生成的Real—TimeWorkshop,以及來自dSpace的工具,。硬件有用于快速控制原型開發(fā)的AutoBox和用于硬件在環(huán)測試的模塊,軟件有產(chǎn)品級代碼生成器TargetLink。它們在加快開發(fā)周期的同時,,也提高了代碼的可靠性,。
    平臺軟件方面,OSEK OS是廣泛應(yīng)用于汽車電子領(lǐng)域的嵌入式操作系統(tǒng)(RTOS)規(guī)范,。它定義了一些基本的系統(tǒng)服務(wù),,比如任務(wù)處理、中斷服務(wù)程序(ISR)處理,、資源管理,、事件處理以及報警服務(wù)等。
    由上可知,,將Matlab/Simulink的建模和仿真環(huán)境在代碼生成階段與OSEK OS規(guī)范相結(jié)合,,將極大地方便開發(fā)。這方面Matlab已有針對OSEK/VDX的嵌入式對象模塊,,TargetLink也實現(xiàn)了部分結(jié)合,,但兩者都局限于特定的硬件,不能應(yīng)用于不同的控制器和實時操作系統(tǒng),。


1 嵌入式軟件開發(fā)理念
    符合基于模型的開發(fā)和OSEK規(guī)范的軟件架構(gòu)如圖1所示,。以英飛凌XC164系列單片機為例,硬件層的核心部件由RTOS提供的系統(tǒng)服務(wù)進行管理,,外設(shè)部件由相應(yīng)的驅(qū)動程序驅(qū)動,。

 

    中間層(軟件運行環(huán)境)包括兩部分,操作系統(tǒng)和硬件驅(qū)動,。操作系統(tǒng)采用順應(yīng)OSEK規(guī)范的μC/OS-II(見3.1),,硬件外設(shè)驅(qū)動開發(fā)在后面作介紹。
    應(yīng)用程序指的是與硬件無關(guān)的軟件,,含控制算法和中斷服務(wù)程序(ISR),。控制算法完成控制任務(wù),,形式一般為Simulink模型,。該模型可以和被控對象模型一起在閉環(huán)狀態(tài)下完成功能仿真,同時也可以在代碼生成階段與硬件驅(qū)動以及操作系統(tǒng)API一起生成可在目標(biāo)硬件上運行的程序,。這里ISR可以有兩種類型,,可以是手寫的C代碼,也可以是Simulink模型中的觸發(fā)子系統(tǒng),。在該子系統(tǒng)中的觸發(fā)源是圖1中所示的硬件層外設(shè),。

                                    
2 MATLAB環(huán)境下代碼生成流程
    實時工作空間(Real-Time Workshop,RTW)代碼生成流程包含下面幾部分,。
    ①仿真和模型文件(model.mdl),。通過手動添加C語言S函數(shù)可以擴展Simulink模型庫,。
    ②中間描述文件(model.rtw)。該文件描述了模型中系統(tǒng)和各模塊以及它們之間的聯(lián)系,,可以看作是模型文件的分層式的描述庫文件,。
    ③目標(biāo)語言編譯器(TLC)文件。目標(biāo)語言編譯器讀取model.rtw文件中的信息,,將模型最終轉(zhuǎn)化成源代碼,。
    TLC文件有兩種形式,系統(tǒng)TLC文件和模塊TLC文件,。前者控制整個模型的代碼生成,,比如可以指定模型生成C語言源代碼,而后者僅針對對應(yīng)的模塊,。對每個手動添加的C語言S函數(shù)對象,,必須有對應(yīng)的模塊TLC文件,才可用于代碼生成,。
    ④生成的源代碼,。圖2中列舉了生成的主要源代碼,其中model.c是model.mdl對應(yīng)生成的算法源代碼,。

                              

    對于生成的源代碼可對其手動添加需要的ISR,,或者整合一些成熟的C算法代碼,然后在Keil環(huán)境下進行編譯,,生成嵌入式可執(zhí)行文件,。下面將model.mdl看作應(yīng)用程序來討論。嵌入式應(yīng)用程序主要完成兩類任務(wù),,周期性任務(wù)和事件驅(qū)動型任務(wù),。后者通常以ISR處理。
    為了使Simulink模型能在RTOS中執(zhí)行,,必須將其劃分成不同的任務(wù),。Targetlink中的任務(wù)劃分如圖3所示。TargetLink有兩種劃分方式,,默認(rèn)方式和自定義方式,。默認(rèn)方式下,TargetLink將模型中所有周期性的具有相同采樣時間的子系統(tǒng)劃歸為獨立任務(wù),,具有相同觸發(fā)源的觸發(fā)子系統(tǒng)結(jié)合在一起,,要么和觸發(fā)源一起歸為同一任務(wù),要么獨立成為新的任務(wù),。自定義方式下,,用戶通過在子系統(tǒng)中添加特殊的“任務(wù)模塊”(見圖3中的“TaskA”、“Task B”,、“Task C”)來任意地劃分任務(wù),。

                                  

    鑒于本開發(fā)是基于Matlab中針對OSEK/VDX的嵌入式對象模塊,,TargetLink中的任務(wù)劃分方式不能被直接移植,因此采用函數(shù)調(diào)用子系統(tǒng)(function-callsubsystem)作為獨立任務(wù)的標(biāo)識,,如圖4中的Task A和Task B模塊,。同Simulink中其他離散模塊一樣,函數(shù)調(diào)用發(fā)生器有自己的采樣時間,,用以表明該子系統(tǒng)被執(zhí)行的頻度。模型中也會有一些其他模塊不在函數(shù)調(diào)用子系統(tǒng)內(nèi),,如圖4中的定時模塊,,以便與任務(wù)模塊相區(qū)分。圖4中ISR的部分采用觸發(fā)子系統(tǒng),,當(dāng)觸發(fā)條件滿足時該子系統(tǒng)被執(zhí)行,。

                                        

3 軟件運行環(huán)境的開發(fā)
3.1 OSEK順應(yīng)性開發(fā)
    近來已有很多商業(yè)嵌入式操作系統(tǒng)符合OSEK規(guī)范,像Wind River的OSEKWorks,、Elektrobit的Pro-OSEK,,還有ETAS的RTA-OSEK。鑒于成本方面的考慮,,采用內(nèi)核源代碼開放的μC/OS-II,。
    μC/0S-II和OSEK規(guī)范有許多共同點,比如都支持基于任務(wù)優(yōu)先級的占先式調(diào)度,,都有很好的可移植性和可裁剪性,。但也存在不同之處,比如OSEK規(guī)范中的BCC2和ECC2順應(yīng)等級都支持同一優(yōu)先級下的多個任務(wù),,而μC/OS-II僅支持同一優(yōu)先級下一個任務(wù),;OSEK規(guī)范對互斥資源的訪問采用最高優(yōu)先級限度協(xié)議,而μC/0S-II采用互斥信號量機制,。參考文獻[6]在基于μC/OS-II的OSEK順應(yīng)性移植方面進行了實際的開發(fā),。本文采用修改過的μC/OS-II作為OSEK的一個操作系統(tǒng)實例,來討論模型的定時機制,。
3.2 定時機制
    Matlab/Simulink環(huán)境下RTw Embedded Coder默認(rèn)采用多速率,、多任務(wù)求解器來處理多采樣時間的模型。在生成的model.c文件中,,有函數(shù)rate_monotonic_sehed-uler(),。該函數(shù)用于維護調(diào)度計數(shù)器,處理模型中不同采樣時間模塊的運行順序,。它實際上就是操作系統(tǒng)中經(jīng)常提到的單調(diào)執(zhí)行率調(diào)度法(RMS),。
    μC/OS-II中函數(shù)OSTickISR()提供時間基準(zhǔn)服務(wù),用于判斷任務(wù)等待以及超時,。這個中斷服務(wù)程序通常由硬件計時器驅(qū)動,,中斷頻率在10~100 Hz,。在函數(shù)0S-TickISR()中調(diào)用了OSTimeTick()用于處理任務(wù)等待。
函數(shù)OSTicklSR()的代碼見代碼段1:
OSTicklSR PROC INTERRUPT UCOS_OSTicklSR=Ox22


    為了將兩者的定時策略相結(jié)合,,可進行兩處修改,。第一,在μc/OS-II中保留函數(shù)OSTickISR(),,但是中斷頻率不是如代碼段1中所示的10 ms那樣的固定值,,而對不同的應(yīng)用程序采用浮動的中斷頻率。這里取model.mdl中所有采樣時間的最大公約數(shù)作為模型的時間基準(zhǔn),。這樣可以最大限度地減小系統(tǒng)因周期性的時鐘中斷OS—TickISR()而造成的資源開銷,。第二,創(chuàng)建一個新任務(wù)HighstPrioTask(),。該任務(wù)具有最高的優(yōu)先級,,即任務(wù)控制塊TCB中OSTCBPrio=0,這樣在每次產(chǎn)生任務(wù)調(diào)度時都能確保該任務(wù)獲得CPU使用權(quán),。該任務(wù)可理解為在圖4中的任務(wù)子系統(tǒng)和定時模塊之上的高一級的調(diào)度任務(wù),。其偽代碼見代碼段2(Pseudocode of added task High-


3.3 創(chuàng)建自定義驅(qū)動模塊
    圖1中軟件運行環(huán)境的自定義開發(fā)可以分為兩部分,一部分是實時操作系統(tǒng)的API驅(qū)動庫的自定義開發(fā),,另一部分是XCl64系列單片機的設(shè)備驅(qū)動模塊開發(fā),。兩者都可利用參考文獻[4]中提及的“自定義設(shè)備驅(qū)動”來描述。在“自定義設(shè)備驅(qū)動”的開發(fā)中,,開發(fā)者通過Matlab提供的S一函數(shù)機制,,為每個模塊需要手動編寫兩個源文件,即block.c和block.tlc,。其中block.c負(fù)責(zé)在仿真階段進行模塊初始化及模塊輸出的計算,,同時在代碼生成階段通過函數(shù)mdlRTW為model.rtw傳遞所需的參數(shù)。文件block.C中出現(xiàn)的主要函數(shù)有:
    ①mdlInitializeSizes,,用于細(xì)化SimStruct結(jié)構(gòu)中不同參數(shù)的維數(shù)(SimStruct是指Simulink數(shù)據(jù)結(jié)構(gòu),,Sim-Struct及其相關(guān)的宏定義參見Matlab目錄下文件sim-strue.h)。
    ②mdlInitializeSampleTimes,,用于細(xì)化該模塊的采樣時間,。
    ③mdlOutputs::對輸入設(shè)備來講,從硬件中讀取值加以計算并傳遞到模塊輸出端,;對輸出設(shè)備而言,,從上流模塊讀取數(shù)據(jù),加以處理并寫回硬件,。
    文件block.tlc用來控制代碼生成過程,,通過相應(yīng)函數(shù)將語句寫入生成的源文件中,代碼段3是一個例子。文件中使用的函數(shù)主要包括:%function BlockTypeSetup(block,,system)void,、%function Start(block,system)Output,、%function Outputs

4 應(yīng)用實例
    圖5是一個簡單的應(yīng)用,。其中建立了兩個任務(wù),任務(wù)ADC_SUM每0.1 S執(zhí)行1次,,任務(wù)ADC_GPIO每0.5 S執(zhí)行1次,。第一個任務(wù)包含一個ADC S函數(shù)模塊。該S函數(shù)屬輸入設(shè)備,,并被封裝成具有圖5所示的參數(shù)輸入界面,;第二個任務(wù)包含另外一個S函數(shù)模塊,GPIO,,在這個應(yīng)用中為輸出模塊。

    像第二部分描述的一樣,,算法可以進行仿真,。仿真完成后可通過RTW生成代碼(本文選擇osekworks.tlc為系統(tǒng)TLC文件,并對該文件進行了適當(dāng)修改),。生成的源代碼(包括*.c源文件和*.h頭文件)可以在Keil C166環(huán)境下聯(lián)合編譯并進行軟件調(diào)試運行,,如圖6所示,這樣也便于集成傳統(tǒng)手動開發(fā)流程中成熟的算法代碼,。最終圖6 Keil C166環(huán)境下編譯帶μo/os—ll的生成源代碼代碼可在目標(biāo)硬件上運行,。

5 結(jié) 論
    目前越來越多的汽車電子系統(tǒng)的開發(fā)借助Matlab/Simulink,并且其已變成標(biāo)準(zhǔn)的開發(fā)工具,。本文提出的軟件開發(fā)方法基于Sireulink環(huán)境和OSEK OS規(guī)范,。在Simulink環(huán)境下開發(fā)的算法可以結(jié)合OSEK RTOS(本文為修改過的μC/OS-II)直接應(yīng)用到目標(biāo)硬件上。該方法已通過實例進行了驗證,,與傳統(tǒng)方法比較極大地縮短了開發(fā)時間,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。