国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Matlab/RTW EC面向MC9S12D64的自動(dòng)代碼生成

2014-09-06 10:49楊潤澤
關(guān)鍵詞:代碼生成底層嵌入式

楊潤澤

(湖北汽車工業(yè)學(xué)院 汽車工程學(xué)院,十堰 442002)

?

Matlab/RTW EC面向MC9S12D64的自動(dòng)代碼生成

楊潤澤

(湖北汽車工業(yè)學(xué)院 汽車工程學(xué)院,十堰 442002)

傳統(tǒng)的電控軟件開發(fā)模式已無法滿足日益龐大、復(fù)雜的汽車電控系統(tǒng)的開發(fā)要求,基于模型的開發(fā)方法以及自動(dòng)代碼生成技術(shù)在汽車嵌入式軟件開發(fā)中得到越來越廣泛的應(yīng)用。本文介紹使用Matlab/Real-Time Workshop Embedded Coder(Matlab/RTW EC)將Simulink控制模型生成C代碼以及生成代碼與Freescale MC9S12D64單片機(jī)底層代碼的集成方法,通過測(cè)試驗(yàn)證了生成代碼的有效性。

嵌入式系統(tǒng);基于模型設(shè)計(jì);代碼生成;RTW EC

引 言

隨著汽車電子控制系統(tǒng)的日益復(fù)雜化,以及用戶對(duì)產(chǎn)品安全性、可靠性的要求,嵌入式應(yīng)用的開發(fā)難度與代碼量都在迅速增加。目前,一臺(tái)中高檔汽車的軟件控制代碼就超過了500萬行,通用雪佛蘭Volt整車的代碼量超過1 000 萬行,而一輛功能先進(jìn)的醫(yī)療急救車甚至需要超過5 000萬行的軟件代碼,而且隨著設(shè)計(jì)內(nèi)容的增加、多變的新特征、模糊的設(shè)計(jì)參數(shù)以及用戶不斷增加的需求,程序員的勞動(dòng)量大大增加,傳統(tǒng)的手工編程方式越來越不能適應(yīng)現(xiàn)代汽車電控系統(tǒng)的設(shè)計(jì)開發(fā)要求[1-2]。

Matlab/Real-Time Workshop Embedded Coder(Matlab/RTW EC)是MathWorks公司提供的嵌入式代碼自動(dòng)生成工具,它能夠快速地將Matlab/Simulink控制器模型自動(dòng)生成優(yōu)化的、可移植的產(chǎn)品級(jí)C代碼,并根據(jù)特定的目標(biāo)配置自動(dòng)生成嵌入式系統(tǒng)實(shí)時(shí)應(yīng)用程序,從而大大減輕軟件工程師的工作量,縮短嵌入式系統(tǒng)的開發(fā)周期,提高開發(fā)效率。本文以Freescale MC9S12D64單片機(jī)為目標(biāo)芯片,說明從Simulink控制模型生成目標(biāo)嵌入式代碼的方法。

1 基于模型的設(shè)計(jì)

基于模型的設(shè)計(jì)是利用計(jì)算機(jī)建模仿真技術(shù),快速完成嵌入式產(chǎn)品等產(chǎn)品開發(fā)過程中核心算法的開發(fā)和驗(yàn)證工作,利用自動(dòng)代碼生成技術(shù)快速完成產(chǎn)品開發(fā)中的邏輯功能、處理算法的實(shí)現(xiàn),同時(shí)利用模型的方法構(gòu)造出被控對(duì)象,方便、快捷、大量重復(fù)地進(jìn)行產(chǎn)品控制效果的驗(yàn)證工作。相比于傳統(tǒng)的開發(fā)模式,基于模型的設(shè)計(jì)開發(fā)流程具有以下一些優(yōu)點(diǎn)[3-4]:

① 在統(tǒng)一的開發(fā)測(cè)試平臺(tái)上,讓設(shè)計(jì)從需求分析階段就開始驗(yàn)證與確認(rèn),并做到持續(xù)不斷地驗(yàn)證與測(cè)試,讓設(shè)計(jì)的缺陷盡量暴露在開發(fā)的初級(jí)階段。

② 讓工程師把主要精力放在算法和測(cè)試用例的研究上,嵌入式C代碼的生成與驗(yàn)證留給計(jì)算機(jī)去自動(dòng)完成。

③ 模型的復(fù)用性好,易于維護(hù)和移植。

④ 大大縮短開發(fā)周期并降低開發(fā)成本。

圖1為基于模型的設(shè)計(jì)開發(fā)流程。在基于模型的設(shè)計(jì)方法中,系統(tǒng)工程師首先要建立一個(gè)系統(tǒng)模型來精確、無歧義地描述用戶的需求,創(chuàng)建一個(gè)可執(zhí)行、可跟蹤的技術(shù)規(guī)范,并在系統(tǒng)模型與需求之間建立雙向鏈接。在整個(gè)開發(fā)過程中,工程師利用測(cè)試用例追蹤系統(tǒng)級(jí)模型和需求,了解系統(tǒng)模型的功能覆蓋度。這些測(cè)試通常包括以下三種:

① 軟件在環(huán)測(cè)試(Software-in-the-Loop, SIL)是對(duì)模型生成的代碼或者手寫代碼進(jìn)行非實(shí)時(shí)仿真,目的是為了驗(yàn)證生成的代碼和模型在功能上的等效性。

② 處理器在環(huán)測(cè)試(Processor-in-the-Loop, PIL)是將自動(dòng)生成的C代碼下載到目標(biāo)處理器中,與被控對(duì)象一起進(jìn)行非實(shí)時(shí)的聯(lián)合仿真,目的是為了測(cè)量模型生成的代碼在目標(biāo)處理器上的運(yùn)行時(shí)間,即檢查運(yùn)行速度和資源消耗。

③ 硬件在環(huán)測(cè)試(Hardware-in-the-Loop, HIL)是把被控對(duì)象的模型生成C代碼并編譯成可執(zhí)行的文件放到工控機(jī)上運(yùn)行,然后把控制器和工控機(jī)通過線束連接,實(shí)現(xiàn)閉環(huán)控制,檢查整個(gè)系統(tǒng)功能。

圖1 基于模型的設(shè)計(jì)開發(fā)流程[5]

顯然,算法的實(shí)現(xiàn)是聯(lián)系系統(tǒng)模型和在環(huán)測(cè)試驗(yàn)證的重要紐帶,這其中所涉及的代碼自動(dòng)生成技術(shù)是基于模型開發(fā)方法的關(guān)鍵技術(shù)之一。自動(dòng)代碼生成的基本流程包括[5]:運(yùn)行Model Advisor進(jìn)行模型檢查、配置代碼生成選項(xiàng)、生成代碼、檢查生成的代碼及報(bào)告以及測(cè)試生成的代碼等5個(gè)環(huán)節(jié)。

生成代碼的過程如圖2所示。用戶在Matlab/Simulink/Stateflow建立的算法模型經(jīng)過Simulink編譯器生成rtw中間文件;rtw文件是一個(gè)描述整個(gè)模型的結(jié)構(gòu)體文本,包含模型中的參數(shù)、變量、模塊名稱以及為代碼生成所做的各種配置,rtw文件經(jīng)過目標(biāo)語言編譯器(Target Language Compiler, TLC)生成C語言代碼,最后通過C編譯器得到最終的可執(zhí)行程序[1,6]。

圖2 Matlab/RTW EC代碼自動(dòng)生成過程[7]

2 流水燈模型建立及嵌入式代碼生成

流水燈Simulink功能驗(yàn)證模型,通過設(shè)置脈沖發(fā)生函數(shù)的周期和占空比,使LED燈按照一定的時(shí)間間隔順時(shí)針方向輪流點(diǎn)亮。示意圖略——編者注。

將流水燈功能驗(yàn)證模型中的脈沖生成器和Goto模塊分別使用In、Out模塊替換后得到的自動(dòng)代碼生成模型如圖3所示。

圖3 代碼生成模型

在Configuration Parameters中對(duì)代碼生成過程進(jìn)行相關(guān)的配置并指定變量的數(shù)據(jù)類型后,Matlab/RTW EC依據(jù)上述的流水燈控制模型自動(dòng)生成了ert_main.c、LightsCtr.c、LightsCtr.h、LightsCtr _private.h、LightsCtr _types.h、LightsCtr _private.h、rtwtypes.h等6個(gè)文件。其中,ert_main.c提供了算法函數(shù)調(diào)用的樣例程序,它包括main()、rt_OneStep()函數(shù)。LightsCtr.c包含了LightsCtr _initialize()、LightsCtr _step()、LightsCtr _terminate()函數(shù),是整個(gè)模型的算法實(shí)現(xiàn)代碼。

3 應(yīng)用層底層代碼集成

Matlab/RTW EC生成的應(yīng)用層代碼和特定芯片的驅(qū)動(dòng)代碼集成目前主要有兩種方式:一種方式是在建模過程中,將驅(qū)動(dòng)程序封裝為S函數(shù)模塊,代碼自動(dòng)生成的過程中建立相應(yīng)芯片的TLC模板文件,實(shí)現(xiàn)一鍵從模型到編譯代碼下載到控制器芯片中。第二種方式是在集成開發(fā)環(huán)境(Integrated Development Environment, IDE)中手工進(jìn)行代碼集成。

在產(chǎn)品化的項(xiàng)目開發(fā)中,采用第一種方式集成代碼,需要對(duì)底層驅(qū)動(dòng)建模,存在以下的困難:①底層驅(qū)動(dòng)在Simulink環(huán)境下不能仿真;②底層驅(qū)動(dòng)建模需要熟悉TLC腳本語言;③產(chǎn)品化項(xiàng)目的底層軟件往往很大,開發(fā)一個(gè)安全、可靠的底層模塊庫,針對(duì)特定的目標(biāo)板定制TLC文件等,都需要大量的時(shí)間投入,不易操作。

從項(xiàng)目開發(fā)的角度考慮,一般的項(xiàng)目多是采用第二種方式,也就是先進(jìn)行產(chǎn)品化代碼生成然后手工進(jìn)行代碼集成,節(jié)省了“目標(biāo)板模型化”的成本和時(shí)間,有利于項(xiàng)目代碼文件的管理與維護(hù),而且問題追溯和代碼調(diào)整也更為方便和靈活。

基于上述考慮,本文采用將自動(dòng)生成的代碼在CodeWarrior中進(jìn)行手工代碼集成,在ert_main.c中添加必要的與硬件相關(guān)的代碼,例如頭文件、中斷服務(wù)程序、硬件初始化代碼、算法與硬件接口代碼、循環(huán)語句等。集成后的ert_main.c源代碼如下:

……

#include /* 刪除頭文件*/

#include "LightsCtr.h" /* Model's header file */

#include "rtwtypes.h" /* MathWorks types */

#include /* 添加頭文件*/

#include "derivative.h" /* 添加頭文件*/

……

long flag=0; //中斷發(fā)生標(biāo)志

#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt 26 void Timer_ISR(void){ //中斷服務(wù)程序

flag++;

MCCNT=0xFFFF;

MCCTL_FLMC=1;

MCFLG_MCZF=1;

}

#pragma CODE_SEG DEFAULT

……

void rt_OneStep(void){

……

/* Re-enable timer or interrupt here */

EnableInterrupts; //允許可屏蔽中斷

……

/* Get model outputs here */

PORTA_BIT7=LightsCtr_Y.Out1;//輸出與硬件端口關(guān)聯(lián)

PORTA_BIT6=LightsCtr_Y.Out2;

PORTA_BIT5=LightsCtr_Y.Out3;

PORTA_BIT4=LightsCtr_Y.Out4;

PORTA_BIT3=LightsCtr_Y.Out5;

PORTA_BIT2=LightsCtr_Y.Out6;

PTM_PTM7=LightsCtr_Y.Out7;

PORTB_BIT2=LightsCtr_Y.Out8;

PORTB_BIT0=LightsCtr_Y.Out9;

PORTK_BIT7=LightsCtr_Y.Out10;

PORTE_BIT2=LightsCtr_Y.Out11;

PORTE_BIT3=LightsCtr_Y.Out12;

……

}

int_T main(int_T argc, const char_T *argv[]){

/* Initialize model */

LightsCtr_initialize();

MCCTL=0xC7;//允許中斷,模數(shù)計(jì)數(shù)方式和分頻常數(shù)設(shè)置

MCCNT=0xFFFF;

MCCTL_FLMC=1;

DDRA=0xFC; //設(shè)置輸出端口

DDRM=0x80;

DDRB=0x05;

DDRK=0x80;

DDRE=0x0C;

……

//刪除printf和fflush代碼

while (rtmGetErrorStatus(LightsCtr_M) == (NULL)) {

/* Perform other application tasks here */

if(flag==1) {

flag=0;

LightsCtr_U.In1=~LightsCtr_U.In1;

//翻轉(zhuǎn)輸入信號(hào),實(shí)現(xiàn)脈沖輸入

}

rt_OneStep();

}

……

}

將集成后的代碼通過inDART-one在我校開發(fā)的汽車電子技術(shù)實(shí)驗(yàn)系統(tǒng)上進(jìn)行了測(cè)試,實(shí)現(xiàn)了預(yù)期LED燈順時(shí)針明燈流動(dòng),驗(yàn)證了整個(gè)開發(fā)流程的可行性。

結(jié) 語

本文建立了LED流水燈的Simulink控制模型,使用Matlab/RTW EC將該控制模型生成嵌入式C代碼,并將自動(dòng)生成的C代碼與Freescale MC9S12D64單片機(jī)底層代碼進(jìn)行了集成和測(cè)試,得到了預(yù)期的LED燈控制效果。這種基于模型的開發(fā)方式以及自動(dòng)代碼生成技術(shù)使得控制算法具有更高的可移植性、更快的開發(fā)迭代速度,從而能夠大大地提升電子控制系統(tǒng)的開發(fā)效率,降低開發(fā)成本。

Yang Runze

(School of Automotive Engineering, Hubei University of Automotive Technology, Shiyan 442002, China)

Tranditional electronic control software development mode can not meet the requirements of increasingly huge and complex automotive electronic control systems. Model-based design associated with automatic code generation is more and more widely used in the development of vechicle embedded software. This paper presents the method for converting Simulink control model to C codes with Matlab/Real-Time Workshop Embedded Coder (Matlab/RTW EC) and integrating the generated codes with low-level codes of Freescale MC9S12D64 microcontroller. Further more, the validation of generated codes is verified by testing.

embedded system; model-based design; code generation; RTW EC

TP368.1

A

猜你喜歡
代碼生成底層嵌入式
航天企業(yè)提升采購能力的底層邏輯
Lustre語言可信代碼生成器研究進(jìn)展
一種基于模型和模板融合的自動(dòng)代碼生成方法
TS系列紅外傳感器在嵌入式控制系統(tǒng)中的應(yīng)用
搭建基于Qt的嵌入式開發(fā)平臺(tái)
嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
代碼生成技術(shù)在軟件開發(fā)中的應(yīng)用
基于XML的代碼自動(dòng)生成工具
倍福 CX8091嵌入式控制器
回到現(xiàn)實(shí)底層與悲憫情懷
兴文县| 蛟河市| 莱芜市| 涪陵区| 安阳市| 讷河市| 噶尔县| 武穴市| 民和| 十堰市| 成安县| 松滋市| 红原县| 航空| 沛县| 仙游县| 钟山县| 武隆县| 稷山县| 西盟| 三原县| 延长县| 安丘市| 双鸭山市| 阳城县| 邢台市| 广宗县| 大邑县| 阿拉善左旗| 凌海市| 仁怀市| 康保县| 定陶县| 龙陵县| 东乌珠穆沁旗| 左贡县| 盘锦市| 胶南市| 东阿县| 开化县| 建德市|