引言 現在V型開(kāi)發(fā)模式已成為使用最廣的汽車(chē)軟件開(kāi)發(fā)流程標準。這一標準流程得到許多工具的支撐,有來(lái)自Mathworks的工具,如用于功能開(kāi)發(fā)和仿真的 Matlab/Simulink/Stateflow,用于自動(dòng)代碼生成的Real—TimeWorkshop,以及來(lái)自dSpace的工具。硬件有用于快速控制原型開(kāi)發(fā)的AutoBox和用于硬件在環(huán)測試的模塊,軟件有產(chǎn)品級代碼生成器TargetLink。它們在加快開(kāi)發(fā)周期的同時(shí),也提高了代碼的可靠性。 平臺軟件方面,OSEK OS是廣泛應用于汽車(chē)電子領(lǐng)域的嵌入式操作系統(RTOS)規范。它定義了一些基本的系統服務(wù),比如任務(wù)處理、中斷服務(wù)程序(ISR)處理、資源管理、事件處理以及報警服務(wù)等。 由上可知,將Matlab/Simulink的建模和仿真環(huán)境在代碼生成階段與OSEK OS規范相結合,將極大地方便開(kāi)發(fā)。這方面Matlab已有針對OSEK/VDX的嵌入式對象模塊,TargetLink也實(shí)現了部分結合,但兩者都局限于特定的硬件,不能應用于不同的控制器和實(shí)時(shí)操作系統。 1 嵌入式軟件開(kāi)發(fā)理念 符合基于模型的開(kāi)發(fā)和OSEK規范的軟件架構如圖1所示。以英飛凌XC164系列單片機為例,硬件層的核心部件由RTOS提供的系統服務(wù)進(jìn)行管理,外設部件由相應的驅動(dòng)程序驅動(dòng)。 中間層(軟件運行環(huán)境)包括兩部分,操作系統和硬件驅動(dòng)。操作系統采用順應OSEK規范的μC/OS-II(見(jiàn)3.1),硬件外設驅動(dòng)開(kāi)發(fā)在后面作介紹。 應用程序指的是與硬件無(wú)關(guān)的軟件,含控制算法和中斷服務(wù)程序(ISR)?刂扑惴ㄍ瓿煽刂迫蝿(wù),形式一般為Simulink模型。該模型可以和被控對象模型一起在閉環(huán)狀態(tài)下完成功能仿真,同時(shí)也可以在代碼生成階段與硬件驅動(dòng)以及操作系統API一起生成可在目標硬件上運行的程序。這里ISR可以有兩種類(lèi)型,可以是手寫(xiě)的C代碼,也可以是Simulink模型中的觸發(fā)子系統。在該子系統中的觸發(fā)源是圖1中所示的硬件層外設。 ![]() 2 MATLAB環(huán)境下代碼生成流程 實(shí)時(shí)工作空間(Real-Time Workshop,RTW)代碼生成流程包含下面幾部分。 ①仿真和模型文件(model.mdl)。通過(guò)手動(dòng)添加C語(yǔ)言S函數可以擴展Simulink模型庫。 ②中間描述文件(model.rtw)。該文件描述了模型中系統和各模塊以及它們之間的聯(lián)系,可以看作是模型文件的分層式的描述庫文件。 ③目標語(yǔ)言編譯器(TLC)文件。目標語(yǔ)言編譯器讀取model.rtw文件中的信息,將模型最終轉化成源代碼。 TLC文件有兩種形式,系統TLC文件和模塊TLC文件。前者控制整個(gè)模型的代碼生成,比如可以指定模型生成C語(yǔ)言源代碼,而后者僅針對對應的模塊。對每個(gè)手動(dòng)添加的C語(yǔ)言S函數對象,必須有對應的模塊TLC文件,才可用于代碼生成。 ④生成的源代碼。圖2中列舉了生成的主要源代碼,其中model.c是model.mdl對應生成的算法源代碼。 ![]() 對于生成的源代碼可對其手動(dòng)添加需要的ISR,或者整合一些成熟的C算法代碼,然后在Keil環(huán)境下進(jìn)行編譯,生成嵌入式可執行文件。下面將 model.mdl看作應用程序來(lái)討論。嵌入式應用程序主要完成兩類(lèi)任務(wù),周期性任務(wù)和事件驅動(dòng)型任務(wù)。后者通常以ISR處理。 為了使Simulink模型能在RTOS中執行,必須將其劃分成不同的任務(wù)。Targetlink中的任務(wù)劃分如圖3所示。TargetLink有兩種劃分方式,默認方式和自定義方式。默認方式下,TargetLink將模型中所有周期性的具有相同采樣時(shí)間的子系統劃歸為獨立任務(wù),具有相同觸發(fā)源的觸發(fā)子系統結合在一起,要么和觸發(fā)源一起歸為同一任務(wù),要么獨立成為新的任務(wù)。自定義方式下,用戶(hù)通過(guò)在子系統中添加特殊的“任務(wù)模塊”(見(jiàn)圖3中的 “TaskA”、“Task B”、“Task C”)來(lái)任意地劃分任務(wù)。 ![]() 鑒于本開(kāi)發(fā)是基于Matlab中針對OSEK/VDX的嵌入式對象模塊,TargetLink中的任務(wù)劃分方式不能被直接移植,因此采用函數調用子系統 (function-callsubsystem)作為獨立任務(wù)的標識,如圖4中的Task A和Task B模塊。同Simulink中其他離散模塊一樣,函數調用發(fā)生器有自己的采樣時(shí)間,用以表明該子系統被執行的頻度。模型中也會(huì )有一些其他模塊不在函數調用子系統內,如圖4中的定時(shí)模塊,以便與任務(wù)模塊相區分。圖4中ISR的部分采用觸發(fā)子系統,當觸發(fā)條件滿(mǎn)足時(shí)該子系統被執行。 ![]() 3 軟件運行環(huán)境的開(kāi)發(fā) 3.1 OSEK順應性開(kāi)發(fā) 近來(lái)已有很多商業(yè)嵌入式操作系統符合OSEK規范,像Wind River的OSEKWorks、Elektrobit的Pro-OSEK,還有ETAS的RTA-OSEK。鑒于成本方面的考慮,采用內核源代碼開(kāi)放的 μC/OS-II。 μC/0S-II和OSEK規范有許多共同點(diǎn),比如都支持基于任務(wù)優(yōu)先級的占先式調度,都有很好的可移植性和可裁剪性。但也存在不同之處,比如OSEK規范中的BCC2和ECC2順應等級都支持同一優(yōu)先級下的多個(gè)任務(wù),而μC/OS-II僅支持同一優(yōu)先級下一個(gè)任務(wù);OSEK規范對互斥資源的訪(fǎng)問(wèn)采用最高優(yōu)先級限度協(xié)議,而μC/0S-II采用互斥信號量機制。參考文獻[6]在基于μC/OS-II的OSEK順應性移植方面進(jìn)行了實(shí)際的開(kāi)發(fā)。本文采用修改過(guò)的μC/OS-II作為OSEK的一個(gè)操作系統實(shí)例,來(lái)討論模型的定時(shí)機制。 3.2 定時(shí)機制 Matlab/Simulink環(huán)境下RTw Embedded Coder默認采用多速率、多任務(wù)求解器來(lái)處理多采樣時(shí)間的模型。在生成的model.c文件中,有函數rate_monotonic_sehed- uler()。該函數用于維護調度計數器,處理模型中不同采樣時(shí)間模塊的運行順序。它實(shí)際上就是操作系統中經(jīng)常提到的單調執行率調度法(RMS)。 μC/OS-II中函數OSTickISR()提供時(shí)間基準服務(wù),用于判斷任務(wù)等待以及超時(shí)。這個(gè)中斷服務(wù)程序通常由硬件計時(shí)器驅動(dòng),中斷頻率在 10~100 Hz。在函數0S-TickISR()中調用了OSTimeTick()用于處理任務(wù)等待。 函數OSTicklSR()的代碼見(jiàn)代碼段1: OSTicklSR PROC INTERRUPT UCOS_OSTicklSR=Ox22 ![]() 為了將兩者的定時(shí)策略相結合,可進(jìn)行兩處修改。第一,在μc/OS-II中保留函數OSTickISR(),但是中斷頻率不是如代碼段1中所示的10 ms那樣的固定值,而對不同的應用程序采用浮動(dòng)的中斷頻率。這里取model.mdl中所有采樣時(shí)間的最大公約數作為模型的時(shí)間基準。這樣可以最大限度地減小系統因周期性的時(shí)鐘中斷OS—TickISR()而造成的資源開(kāi)銷(xiāo)。第二,創(chuàng )建一個(gè)新任務(wù)HighstPrioTask()。該任務(wù)具有最高的優(yōu)先級,即任務(wù)控制塊TCB中OSTCBPrio=0,這樣在每次產(chǎn)生任務(wù)調度時(shí)都能確保該任務(wù)獲得CPU使用權。該任務(wù)可理解為在圖4中的任務(wù)子系統和定時(shí)模塊之上的高一級的調度任務(wù)。其偽代碼見(jiàn)代碼段2(Pseudocode of added task High- ![]() 3.3 創(chuàng )建自定義驅動(dòng)模塊 圖1中軟件運行環(huán)境的自定義開(kāi)發(fā)可以分為兩部分,一部分是實(shí)時(shí)操作系統的API驅動(dòng)庫的自定義開(kāi)發(fā),另一部分是XCl64系列單片機的設備驅動(dòng)模塊開(kāi)發(fā)。兩者都可利用參考文獻[4]中提及的“自定義設備驅動(dòng)”來(lái)描述。在“自定義設備驅動(dòng)”的開(kāi)發(fā)中,開(kāi)發(fā)者通過(guò)Matlab提供的S一函數機制,為每個(gè)模塊需要手動(dòng)編寫(xiě)兩個(gè)源文件,即block.c和block.tlc。其中block.c負責在仿真階段進(jìn)行模塊初始化及模塊輸出的計算,同時(shí)在代碼生成階段通過(guò)函數mdlRTW為model.rtw傳遞所需的參數。文件block.C中出現的主要函數有: ①mdlInitializeSizes,用于細化SimStruct結構中不同參數的維數(SimStruct是指Simulink數據結構,Sim- Struct及其相關(guān)的宏定義參見(jiàn)Matlab目錄下文件sim-strue.h)。 ②mdlInitializeSampleTimes,用于細化該模塊的采樣時(shí)間。 ③mdlOutputs::對輸入設備來(lái)講,從硬件中讀取值加以計算并傳遞到模塊輸出端;對輸出設備而言,從上流模塊讀取數據,加以處理并寫(xiě)回硬件。 文件block.tlc用來(lái)控制代碼生成過(guò)程,通過(guò)相應函數將語(yǔ)句寫(xiě)入生成的源文件中,代碼段3是一個(gè)例子。文件中使用的函數主要包括:%function BlockTypeSetup(block,system)void、%function Start(block,system)Output、%function Outputs ![]() 4 應用實(shí)例 圖5是一個(gè)簡(jiǎn)單的應用。其中建立了兩個(gè)任務(wù),任務(wù)ADC_SUM每0.1 S執行1次,任務(wù)ADC_GPIO每0.5 S執行1次。第一個(gè)任務(wù)包含一個(gè)ADC S函數模塊。該S函數屬輸入設備,并被封裝成具有圖5所示的參數輸入界面;第二個(gè)任務(wù)包含另外一個(gè)S函數模塊,GPIO,在這個(gè)應用中為輸出模塊。 ![]() 像第二部分描述的一樣,算法可以進(jìn)行仿真。仿真完成后可通過(guò)RTW生成代碼(本文選擇osekworks.tlc為系統TLC文件,并對該文件進(jìn)行了適當修改)。生成的源代碼(包括*.c源文件和*.h頭文件)可以在Keil C166環(huán)境下聯(lián)合編譯并進(jìn)行軟件調試運行,如圖6所示,這樣也便于集成傳統手動(dòng)開(kāi)發(fā)流程中成熟的算法代碼。最終圖6 Keil C166環(huán)境下編譯帶μo/os—ll的生成源代碼代碼可在目標硬件上運行。 ![]() 5 結論 目前越來(lái)越多的汽車(chē)電子系統的開(kāi)發(fā)借助Matlab/Simulink,并且其已變成標準的開(kāi)發(fā)工具。本文提出的軟件開(kāi)發(fā)方法基于Sireulink環(huán)境和OSEK OS規范。在Simulink環(huán)境下開(kāi)發(fā)的算法可以結合OSEK RTOS(本文為修改過(guò)的μC/OS-II)直接應用到目標硬件上。該方法已通過(guò)實(shí)例進(jìn)行了驗證,與傳統方法比較極大地縮短了開(kāi)發(fā)時(shí)間。 參考文獻 1. Henning Wallentowitz Konrad Reif:Handbuch-Kraftfahrzeugelektronik,Grundlagen,Komponenten,Systeme,Anwendung 2006 2. OSEK OS 2.2.1.OSEK/VDX Operation System Specification 2.2.1 3. TIAN Shuo.LIU Yuan.XIA Wenchuan.LI Jianqiu.YANG Minggao Advanced ECU Software Development Method for Fuel Cell Systems [期刊論文] -清華大學(xué)學(xué)報自然科學(xué)版(英文版)2005(5) 4. Real-Time Workshop User's Guide 5. K?ster Lutz.Thomsen Thomas.Stracke Ralf Connecting Simulink to OSEK:Automatic Code Generation For Real-Time Operating Systems with TargetLink 2008 6. 顧劍杰 基于μC/OS-II的OSEK順應性開(kāi)發(fā)研究 2008 7. Real-Time Workshop Embedded Coder User's Guide 8. Labrosse Jean J.邵貝貝 嵌入式實(shí)時(shí)操作系統μC/OS-II 2005 作者:同濟大學(xué) 張永博 沈勇 來(lái)源:?jiǎn)纹瑱C與嵌入式系統應用 2009(5) |