<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Simulink的OSEK嵌入式軟件開(kāi)發(fā)方法

基于Simulink的OSEK嵌入式軟件開(kāi)發(fā)方法

作者: 時(shí)間:2009-06-30 來(lái)源:網(wǎng)絡(luò ) 收藏

對于生成的源代碼可對其手動(dòng)添加需要的ISR,或者整合一些成熟的C算法代碼,然后在Keil環(huán)境下進(jìn)行編譯,生成可執行文件。下面將model.mdl看作應用程序來(lái)討論。應用程序主要完成兩類(lèi)任務(wù),周期性任務(wù)和事件驅動(dòng)型任務(wù)。后者通常以ISR處理。
為了使模型能在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中針對/VDX的對象模塊,TargetLink中的任務(wù)劃分方式不能被直接移植,因此采用函數調用子系統(function-callsubsystem)作為獨立任務(wù)的標識,如圖4中的Task A和Task B模塊。同中其他離散模塊一樣,函數調用發(fā)生器有自己的采樣時(shí)間,用以表明該子系統被執行的頻度。模型中也會(huì )有一些其他模塊不在函數調用子系統內,如圖4中的定時(shí)模塊,以便與任務(wù)模塊相區分。圖4中ISR的部分采用觸發(fā)子系統,當觸發(fā)條件滿(mǎn)足時(shí)該子系統被執行。

3 軟件運行環(huán)境的開(kāi)發(fā)
3.1 順應性開(kāi)發(fā)
近來(lái)已有很多商業(yè)嵌入式操作系統符合規范,像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/環(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中出現的主要函數有:

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>