本文轉(zhuǎn)載在我的微信公眾號(hào):古德曼汽車工業(yè)麸锉。公眾號(hào)文章都會(huì)知識(shí)星球、知乎進(jìn)行轉(zhuǎn)載星持,請(qǐng)有興趣的朋友可以關(guān)注我的微信公眾號(hào)
原文地址:Sinmulink代碼生成基礎(chǔ)體驗(yàn)教程
?前言
一個(gè)完整的控制器(xCU)嵌入式程序在邏輯架構(gòu)均可分為兩層:一個(gè)是應(yīng)用邏輯層(Application Software)藕施,用來表達(dá)整個(gè)控制邏輯的實(shí)現(xiàn)算法;還有一個(gè)是基礎(chǔ)軟件層(Basic Software)也就是常說的底層驅(qū)動(dòng)彤委,負(fù)責(zé)芯片功能進(jìn)行初始化,例如:定時(shí)器或衡、鎖相環(huán)焦影、CAN、SPI等封断。邏輯層與基礎(chǔ)軟件層之間需要有一個(gè)接口層(Interface Layer)實(shí)現(xiàn)數(shù)據(jù)的交互斯辰。
Simulink代碼生成技術(shù)的出現(xiàn)很好的解決的控制器程序開發(fā)的分工問題,控制策略由各專業(yè)工程師開發(fā)坡疼,而底層驅(qū)動(dòng)由嵌入式工程師完成彬呻。控制策略工程師可利用Simulink強(qiáng)大的建模與測(cè)試功能開發(fā)控制策略模型柄瑰,最后將生成嵌入式代碼與底層驅(qū)動(dòng)一起編譯成二進(jìn)制文件闸氮。另外,如果硬件變更或者硬件升級(jí)教沾,只需要修改驅(qū)動(dòng)成代碼不需要更改測(cè)試好的邏輯層策略蒲跨。
代碼生成工具
早期Simulink代碼生成主要依托dSpace公司的TargetLink實(shí)現(xiàn)。安裝了TargetLink后详囤,在Simulink中就會(huì)出現(xiàn)TargetLink自帶的元件庫(kù)财骨,如果你原先仿真時(shí)用的是Simulink的標(biāo)準(zhǔn)原件镐作,就需要將模型轉(zhuǎn)換成TargetLink模型藏姐。近幾年由于Simulink EmbeddedCoder在技術(shù)上日趨成熟,并且推廣力度也比較大该贾。所以越來越多廠家開始使用EmbeddedCoder生成嵌入式代碼羔杨。接下來篇幅就來演示如何使用Simulink的EmbeddedCoder功能快速生成C語言代碼。
代碼生成基礎(chǔ)操作
這部分內(nèi)容為了讓各位對(duì)嵌入式代碼生成有個(gè)直觀的感受杨蛋,希望有興趣的可以跟著一起練習(xí)下兜材,【思想】當(dāng)初學(xué)習(xí)也是從這部分開始的理澎。
以一個(gè)簡(jiǎn)單的模型為例,有兩個(gè)輸入分別為x曙寡、y糠爬,一個(gè)輸出z。運(yùn)算過程為z=(x+y)*k;
第一個(gè)重要的設(shè)置就是解算法举庶,這里一定要設(shè)置為離散的定步長(zhǎng)算法执隧,并設(shè)置步長(zhǎng)。因?yàn)樗械目刂破鲀?nèi)部都會(huì)有一個(gè)模數(shù)遞減器户侥,用來實(shí)現(xiàn)一個(gè)步長(zhǎng)的精確定時(shí)镀琉。大部分控制一個(gè)步長(zhǎng)都設(shè)置為10ms。
在模型設(shè)置中的代碼生成選項(xiàng)蕊唐,選取代碼生成的模板屋摔。本次使用的時(shí)EmbeddedCoder,所以選擇與其對(duì)應(yīng)的ert.tlc替梨。特別注意的是由于生成的代碼不會(huì)使用Simulink的編譯工具進(jìn)行編譯钓试,所以需要勾選Generate Code Only,這樣就只會(huì)生成C文件與h文件副瀑。
點(diǎn)擊Build Model按鈕或者使用快捷鍵Ctrl+B進(jìn)行生成代碼亚侠,生成的代碼會(huì)有一個(gè)報(bào)告,包含模型的配置信息俗扇。在左邊的框中提示了本次生成代碼的文件硝烂,點(diǎn)擊可以對(duì)代碼進(jìn)行查看。生成ert_main.c文件包含了一些模型的初始化并調(diào)用模型的主函數(shù)铜幽,正常開發(fā)過程中這個(gè)文件是不會(huì)被用到滞谢。Main函數(shù)正常都在芯片開發(fā)環(huán)境中編寫。接口與調(diào)度這部分內(nèi)容會(huì)在后面的文章中詳細(xì)敘述除抛,敬請(qǐng)關(guān)注狮杨。GenerateCode.c文件則就是存放Simulink模型生成代碼的文件,還有若干個(gè)h文件和Simulink自帶的引用文件到忽。
GenerateCode_Step函數(shù)中橄教,就是Simulink模型生成C語言代碼,可以看到這里的輸入與輸出都是以結(jié)構(gòu)體的形式進(jìn)行表達(dá)的喘漏,k值則是在WorkPlace中直接賦值护蝶。這樣的代碼可讀性比較低,接下來就對(duì)模型進(jìn)行更多的優(yōu)化設(shè)置翩迈。
在Simulink數(shù)據(jù)管理器中使用mpt.Signal添加4個(gè)變量持灰,分別命名為x、y负饲、z堤魁、k設(shè)置數(shù)據(jù)類型喂链、存儲(chǔ)方式等,并且對(duì)k賦予初始值妥泉。
選中信號(hào)線并右鍵進(jìn)入properites【屬性】對(duì)話框椭微,在SignalName中輸入剛剛創(chuàng)建的變量名,并勾選Signal name must resolveto Simulink signal object盲链。
設(shè)置后的模型效果赏表,可以看到這時(shí)候信號(hào)線上多了個(gè)關(guān)聯(lián)圖標(biāo)并再次對(duì)模型生成代碼。
生成后的代碼就可以看到與第一次生成的相比匈仗,那幾個(gè)晦澀難懂的結(jié)構(gòu)體已經(jīng)被具體的變量名取代了瓢剿。以上這個(gè)部分很重要,這是后續(xù)接口層開發(fā)的要點(diǎn)悠轩。
函數(shù)的封裝
手工寫過代碼的朋友一定有這樣的經(jīng)驗(yàn)间狂,盡可能的要把相同邏輯的代碼用一個(gè)函數(shù)封裝起來。這樣既可以很方便地調(diào)用代碼火架,也能夠減少代碼冗余提高執(zhí)行效率鉴象。同樣的使用Simulink建模也需要考慮這個(gè)問題。
對(duì)剛剛的模型進(jìn)行簡(jiǎn)單的封裝何鸡,并復(fù)制一個(gè)出來纺弊。兩個(gè)子系統(tǒng)中的邏輯都是z=(x+y)*k,區(qū)別僅僅是輸入與輸出不同骡男。
右鍵對(duì)Subsystem模塊屬性進(jìn)行設(shè)置淆游,勾選【Treat as atomic unit】設(shè)置為原子子系統(tǒng),并自定義一個(gè)函數(shù)名隔盛。
生成代碼后可以看到犹菱,左邊兩個(gè)Subsystem均調(diào)用了同一個(gè)函數(shù)。
生成代碼的設(shè)置
生成代碼的設(shè)置除了上面的選擇編譯模板一定要配置外吮炕,下面這幾個(gè)選項(xiàng)也是需要注意的腊脱。
如果比較細(xì)心的朋友會(huì)發(fā)現(xiàn)前面生成報(bào)告的硬件信息為Intel->x86-64 (Windows64),在模型設(shè)置中可以對(duì)設(shè)備進(jìn)行指派龙亲,設(shè)置芯片的廠家陕凹、型號(hào)、各數(shù)據(jù)類型的數(shù)據(jù)長(zhǎng)度鳄炉、甚至字節(jié)序杜耙。
另外這部分是很容易被忽略的,這里可以根據(jù)不同的C語言標(biāo)準(zhǔn)來生成代碼迎膜,支持C99和C89標(biāo)準(zhǔn)泥技。做嵌入式開發(fā)的朋友一定要根據(jù)自己的開發(fā)環(huán)境來選擇浆兰,如使用code warrior 5.2的朋友一定要選擇C89磕仅,選擇C99就會(huì)出現(xiàn)編譯錯(cuò)誤的問題珊豹。
更多內(nèi)容
更多的基礎(chǔ)設(shè)置及細(xì)節(jié)問題可以向思想索取Matlab官方培訓(xùn)視頻及思想對(duì)該視頻的學(xué)習(xí)筆記ppt