從Matlab Simulink生成易讀可重用代碼_第1頁
從Matlab Simulink生成易讀可重用代碼_第2頁
從Matlab Simulink生成易讀可重用代碼_第3頁
從Matlab Simulink生成易讀可重用代碼_第4頁
從Matlab Simulink生成易讀可重用代碼_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、從Matlab Simulink生成易讀可重用代碼by: 吳少風(fēng)MATLAB提供從MATLAB代碼或simulink模型生成C/C+代碼的功能。從MATLAB 2011b版開始,MATLAB將代碼生成Coder作為單獨(dú)模塊發(fā)布。MATLAB每年更新兩次,經(jīng)過不斷完善,新版本的Coder功能更強(qiáng)大。用MATLAB生成C/C+代碼具有MATLAB Coder、Simulink Coder、Embedded Coder三個功能模塊,MATLAB Coder從MATLAB 代碼生成代碼,Simulink Coder從Simulink模型生成代碼,Embedded Coder結(jié)合MATLAB Coder

2、和Simulink Coder,生成嵌入式代碼。利用代碼生成功能,可以快速從模型生成可靠的代碼,應(yīng)用越來越廣泛。要生成易于閱讀、重用性好的代碼,必須進(jìn)行詳細(xì)設(shè)置。文中內(nèi)容以易讀、可重用為目標(biāo),建立嵌入式代碼生成的演示模型,了解Simulink代碼生成相關(guān)工具,介紹詳細(xì)設(shè)置步驟,最終生成容易閱讀、可重用代碼,供單處理器單任務(wù)實(shí)時(shí)嵌入式系統(tǒng)應(yīng)用。文中的方法為嚴(yán)格控制生成代碼的個人總結(jié)。以文檔呈現(xiàn),方便自己今后查看,也希望能為其他人提供一些方便。1. 簡單示例本部分搭建一個簡單的PI控制器模型,示范模型建立、設(shè)置、生成代碼的詳細(xì)步驟。1) 新建嵌入式代碼生成模型,MATLAB->simulin

3、k,New / Embedded Coder / Code Generation System。不選擇一般simulink模板,可減少模型配置參數(shù)的設(shè)置。2) 搭建如Error! Reference source not found.所示簡易模型,保存文檔,設(shè)置文件名。圖 1. 一個簡單示例模型3) 點(diǎn)擊工具欄圖標(biāo) ,設(shè)置模型配置參數(shù),應(yīng)用并保存。對嵌入式應(yīng)用,固定步長,離散,可調(diào)參數(shù),ERT目標(biāo),C語言,設(shè)置基本固定,未設(shè)置的地方保持默認(rèn)。è solver options: type - Fixed step. solver - Discrete. è optimizat

4、ion->signals and parameters: l Default parameter behavior - tunable. l Pass reusable subsystem outputs as -輸出較多選用structure reference.è hardware implementation: 按實(shí)際設(shè)hardware board, device, device details.è code generation: l System target file - ert.tlc, Language - C, generate code only.

5、 code generation objectives.Ø comments: include comments, 默認(rèn)全選,可按需要選擇。Ø symbols: 命名規(guī)則設(shè)置,按各自代碼規(guī)范設(shè)置。Ø interface: 設(shè)置整個模型生成代碼的接口。² code interface package,可選擇可重用,Pass root level I/O as,模型輸入輸出參數(shù)一般較多,一般選擇結(jié)構(gòu)體,structure reference,模型數(shù)據(jù)、輸入、輸出通過各自獨(dú)立結(jié)構(gòu)體傳入?yún)?shù);part of model data structure,一個結(jié)構(gòu)體傳

6、入?yún)?shù)。也可選擇不可重用。² configure model functions,點(diǎn)擊進(jìn)入,設(shè)置模型具體的C原型。get default configuration,可修改模型默認(rèn)initialize/step函數(shù)名,及參數(shù),各輸入輸出單獨(dú)作為函數(shù)參數(shù),這與結(jié)構(gòu)體傳參是矛盾的,不能同時(shí)設(shè)置。Ø code style: 設(shè)置代碼風(fēng)格。² Parentheses括號, - Nominal(readability),按可讀性優(yōu)化。² Casting mode 強(qiáng)制轉(zhuǎn)換方式,Nominal. ² Code indentation 代碼縮進(jìn), size

7、- 4.Ø Code placement: 代碼放置,可設(shè)置變量定義或聲明在單獨(dú)文件還是和源代碼放一起,頭文件包含是< head.h >還是" head.h "。Ø Data type replacement: 數(shù)據(jù)類型替換。4) 設(shè)置模型中每一個基本模塊的屬性。包括名稱、值、數(shù)據(jù)類型、采樣時(shí)間等。子模塊或者引用模型等這類自定義模塊,除了內(nèi)部基本模塊的屬性外,還要設(shè)置各自的模塊屬性。模塊中參數(shù)等值,必須按照設(shè)計(jì)配置;如果想使用可調(diào)參數(shù),則將參數(shù)設(shè)置為變量,再設(shè)置變量值。生成代碼模型中的模塊名設(shè)置,最好遵循目標(biāo)語言的命名規(guī)則,因?yàn)樯纱a中的一

8、些名稱可以從模塊名繼承。嵌入式應(yīng)用大多無浮點(diǎn)單元,定點(diǎn)數(shù)據(jù)的設(shè)置在模塊屬性的代碼生成欄。將圖 1中各模塊可按如下方式設(shè)置:l inport,點(diǎn)擊模塊下方名稱,設(shè)置模塊名,將其設(shè)置為In;雙擊模塊進(jìn)入模塊屬性設(shè)置,main欄設(shè)置編號,編號會體現(xiàn)在子系統(tǒng)或引用模型上;signal attributes設(shè)置數(shù)據(jù)類型為定點(diǎn)數(shù),16b字長10b小數(shù)部分fixdt(1,16,10)。其它模塊設(shè)置方法類似。l view->model data,彈出model data窗口。simulink提供的model data窗口,用于顯示當(dāng)前層級下的所有輸入輸出、信號、狀態(tài)、參數(shù),并將對應(yīng)屬性羅列成表格,而且表

9、格可編輯部分屬性。l Kp增益模塊,雙擊模塊,輸出數(shù)據(jù)類型設(shè)置為同輸入,參數(shù)數(shù)據(jù)類型設(shè)置為從Gain繼承,Gain設(shè)置為Kp。l 在model data窗口,參數(shù)欄,Kp模塊,值變?yōu)镵p,其后出現(xiàn)create.鏈接字樣。點(diǎn)擊彈出create new data窗口,值選擇Simulink.Parameter,位置選擇Base Workspace,創(chuàng)建,彈出Simulink.Parameter: Kp屬性窗口,設(shè)置值為10,數(shù)據(jù)類型為定點(diǎn)數(shù)fixdt(1,16,10),存儲類型選擇ExportedGlobal,確定。l Ki增益模塊,使用設(shè)置Kp的方法將simulink參數(shù)屬性值設(shè)為1。l Fil

10、e->Model properties,彈出模型屬性窗口,選擇數(shù)據(jù)欄,將數(shù)據(jù)定義到數(shù)據(jù)字典,選擇或新建一個數(shù)據(jù)字典文件,應(yīng)用。建立在基本工作區(qū)的數(shù)據(jù)遷移到數(shù)據(jù)字典保存。后面該模型新建參數(shù)等數(shù)據(jù),基本工作區(qū)的位置將被數(shù)據(jù)字典代替。保存在基本工作區(qū)的數(shù)據(jù),關(guān)閉MATLAB不會自動保存,因此一些模型也采用腳本配置。位置也可選擇模型工作區(qū),但保存到模型工作區(qū)的參數(shù),有效的存儲類型會受到限制。l unit delay單位延時(shí),初始條件設(shè)為0,狀態(tài)名稱按實(shí)際意義設(shè)置。l Outport,數(shù)據(jù)類型可選自動。信號名稱,可到model data窗口統(tǒng)一設(shè)置,該窗口中選中信號,模型區(qū)會用顏色標(biāo)記對應(yīng)標(biāo)記。沒

11、有設(shè)置名稱的信號,按照內(nèi)部規(guī)則生成代碼。模型相關(guān)設(shè)置,simulink還提供model explorer圖形界面統(tǒng)一管理。點(diǎn)擊圖標(biāo)可打開。5) 設(shè)置完成后,啟用Advisor檢查模型設(shè)置。選擇檢查項(xiàng)目,運(yùn)行檢查,修改不符合的項(xiàng)目。analysis -> model advisor,針對模型,可選項(xiàng)目包括MISRA、ISO26262等。選中by task,右側(cè)點(diǎn)擊run selected checks。analysis -> data type design -> fixed point tool,進(jìn)入設(shè)置后,左側(cè)選擇項(xiàng)目,右側(cè)運(yùn)行檢查。code -> C/C+ code

12、 -> code generation advisor,針對生成代碼,可選項(xiàng)目有空間效率、執(zhí)行效率、可追蹤性、安全預(yù)警、MISRA C: 2012 guidelines等。檢查項(xiàng)目可能會彈出一些警告,是之前手動設(shè)置的,這時(shí)選擇忽略。比如內(nèi)聯(lián)參數(shù)有效率,但想要用可調(diào)參數(shù),就只能忽略檢查時(shí)的警告。6) 點(diǎn)擊圖標(biāo),編譯模型生成代碼。完成后可查看報(bào)告。算法代碼如下:數(shù)據(jù)定義如下:2. Simulink生成代碼相關(guān)工具在“1簡單示例”一節(jié),介紹了代碼生成的詳細(xì)過程。其中一些常用的工具及菜單,現(xiàn)羅列于表 1中。表 1. 常用工具及菜單圖標(biāo)名稱最方便的位置功能Library Browser工具欄圖標(biāo)基

13、本模塊庫,搭建模型的基本元素所在庫。Model Configuration Parameters工具欄圖標(biāo)模型配置參數(shù),模型仿真、生成代碼所依賴的全局規(guī)則。Mode Data菜單View- -Mode Data列表顯示當(dāng)前層級模型的信號、參數(shù)、狀態(tài)等,可以在此處集中編輯。Model Explorer工具欄圖標(biāo)樹狀結(jié)構(gòu)的模型管理器,包括數(shù)據(jù)、配置、子模塊等。從樹狀結(jié)構(gòu)可以看出,每一個模型都單獨(dú)包含數(shù)據(jù)數(shù)據(jù)、配置等元素。Model Advisor工具欄圖標(biāo)根據(jù)選定項(xiàng),針對模型設(shè)計(jì),進(jìn)行檢查,提供建議。用戶根據(jù)建議修改自己的模型。Code Generation AdvisorModel Adviso

14、r-圖標(biāo)下拉根據(jù)選定項(xiàng),針對代碼生成設(shè)置,進(jìn)行檢查,提供建議。用戶根據(jù)建議修改自己的模型。Fixed-Point Tool菜單Analysis - - data Type Design - Fixed-Point Tool針對定點(diǎn)數(shù)設(shè)計(jì),進(jìn)行檢驗(yàn),提供建議。用戶可以根據(jù)建議修改自己的模型。Build Model工具欄圖標(biāo)根據(jù)配置,編譯模型生成代碼。圖標(biāo)下拉欄還有:編譯備選子系統(tǒng),嵌入式代碼快速向?qū)?。快速向?qū)О床襟E生成新配置,并依次生成代碼。Run工具欄圖標(biāo)模型仿真運(yùn)行。一般首先會用仿真驗(yàn)證模型。3. Coder保留的默認(rèn)名稱在“1簡單示例”一節(jié),生成的代碼中出現(xiàn)了一些固定的名稱,這些是代碼生成

15、器保留的默認(rèn)名稱,用戶不能改變。為方便理解生成的代碼,將這些默認(rèn)名稱及含義列于表 1中。表 2. 生成代碼中的默認(rèn)名稱默認(rèn)名稱含義默認(rèn)名稱含義U整個模型的輸入模塊local局部變量加的前綴Y整個模型的輸出模塊rt全局變量的前綴,可設(shè)置B模塊輸出信號rtb局部模塊輸出的前綴,可設(shè)置P模塊參數(shù)_T默認(rèn)類型后綴,可替換DW離散模塊狀態(tài)step模型入口,可設(shè)置DefaultP默認(rèn)參數(shù)initialize模型初始化,可設(shè)置Ext全局類型加的前綴4. 代碼重用該部分將搭建一個稍微復(fù)雜模型,封裝參數(shù),生成可重用代碼。1) 建立如Error! Reference source not found.模型。圖 2

16、. PID模型2) 選中上面模型,右鍵,create subsystem from selection進(jìn)入子系統(tǒng),按上面介紹的方法編輯各基本模塊。為信號和狀態(tài)起名,設(shè)置輸入數(shù)據(jù)類型,輸出數(shù)據(jù)類型和輸入保持一致。參數(shù)設(shè)置為結(jié)構(gòu)體,比如KpGain的值設(shè)置為pid.Kp,數(shù)據(jù)類型繼承。3) 返回模型上一級,修改子系統(tǒng)名稱為Dpid,選中子系統(tǒng)右鍵 -> mask -> edit mask,在parameter選項(xiàng)卡,編輯參數(shù),將名稱設(shè)為pid。4) 右鍵->subsystem parameters,勾選treat as atomic unit,function packing設(shè)為

17、reusable,函數(shù)名設(shè)為UnSatIntPid。5) 打開model explorer,在數(shù)據(jù)字典中添加simulink bus類,選中該類,右下角launch bus editor進(jìn)入編輯,設(shè)置類名稱為PidParaStrc,將參數(shù)按名稱依次添加到類,并設(shè)置基本數(shù)據(jù)類型。6) 在數(shù)據(jù)字典中添加simulink parameter對象,將對象數(shù)據(jù)名稱設(shè)為DpidPar,類型設(shè)為PidParaStrc,值設(shè)為struct,存儲類型設(shè)為ExportedGlobal。在DpidPar值屬性列,編輯與PidParaStrc類成員對應(yīng)的參數(shù)名稱,并賦值。將simulink參數(shù)DpidPar復(fù)制一份,

18、編輯其參數(shù)值。7) 將子系統(tǒng)Dpid復(fù)制一份,名稱改為Qpid,設(shè)置mask參數(shù)為QpidPar,連上輸入輸出,最終模型如圖所示。圖 3. 代碼重用演示模型8) 設(shè)置好模型配置參數(shù),編譯生成代碼,查看生成的報(bào)告。整個模型的代碼如下,調(diào)用兩次UnSatIntPid函數(shù),分別傳入不同的參數(shù)。生成可重用的算法如下所示,函數(shù)名為設(shè)置的UnSatIntPid,函數(shù)參數(shù)有四個,依次是給定,反饋,子系統(tǒng)狀態(tài),PidParaStrc參數(shù)。5. 數(shù)據(jù)重用嵌入式應(yīng)用多用查表的方式實(shí)現(xiàn)較復(fù)雜的數(shù)學(xué)函數(shù),比如三角函數(shù)。而且為了保證精度,表格的數(shù)據(jù)一般較多。通常,如正弦函數(shù),會充分利用周期性對稱性,查找(0, pi/2)的sin表格。本部分將演示,將(0, pi/2)的sin表格定義為全局const變量,單獨(dú)放在一個文件,實(shí)現(xiàn)sin/cos函數(shù)。1) 建立如圖 4模型實(shí)現(xiàn)sin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論