本文轉(zhuǎn)載在我的微信公眾號:古德曼汽車工業(yè)。公眾號文章都會知識星球、知乎進行轉(zhuǎn)載,請有興趣的朋友可以關(guān)注我的微信公眾號
原文地址:Sinmulink代碼生成基礎體驗教程
?前言
一個完整的控制器(xCU)嵌入式程序在邏輯架構(gòu)均可分為兩層:一個是應用邏輯層(Application Software),用來表達整個控制邏輯的實現(xiàn)算法;還有一個是基礎軟件層(Basic Software)也就是常說的底層驅(qū)動,負責芯片功能進行初始化,例如:定時器、鎖相環(huán)、CAN、SPI等。邏輯層與基礎軟件層之間需要有一個接口層(Interface Layer)實現(xiàn)數(shù)據(jù)的交互。
Simulink代碼生成技術(shù)的出現(xiàn)很好的解決的控制器程序開發(fā)的分工問題,控制策略由各專業(yè)工程師開發(fā),而底層驅(qū)動由嵌入式工程師完成??刂撇呗怨こ處熆衫肧imulink強大的建模與測試功能開發(fā)控制策略模型,最后將生成嵌入式代碼與底層驅(qū)動一起編譯成二進制文件。另外,如果硬件變更或者硬件升級,只需要修改驅(qū)動成代碼不需要更改測試好的邏輯層策略。
代碼生成工具
早期Simulink代碼生成主要依托dSpace公司的TargetLink實現(xiàn)。安裝了TargetLink后,在Simulink中就會出現(xiàn)TargetLink自帶的元件庫,如果你原先仿真時用的是Simulink的標準原件,就需要將模型轉(zhuǎn)換成TargetLink模型。近幾年由于Simulink EmbeddedCoder在技術(shù)上日趨成熟,并且推廣力度也比較大。所以越來越多廠家開始使用EmbeddedCoder生成嵌入式代碼。接下來篇幅就來演示如何使用Simulink的EmbeddedCoder功能快速生成C語言代碼。
代碼生成基礎操作
這部分內(nèi)容為了讓各位對嵌入式代碼生成有個直觀的感受,希望有興趣的可以跟著一起練習下,【思想】當初學習也是從這部分開始的。
以一個簡單的模型為例,有兩個輸入分別為x、y,一個輸出z。運算過程為z=(x+y)*k;
第一個重要的設置就是解算法,這里一定要設置為離散的定步長算法,并設置步長。因為所有的控制器內(nèi)部都會有一個模數(shù)遞減器,用來實現(xiàn)一個步長的精確定時。大部分控制一個步長都設置為10ms。
在模型設置中的代碼生成選項,選取代碼生成的模板。本次使用的時EmbeddedCoder,所以選擇與其對應的ert.tlc。特別注意的是由于生成的代碼不會使用Simulink的編譯工具進行編譯,所以需要勾選Generate Code Only,這樣就只會生成C文件與h文件。
點擊Build Model按鈕或者使用快捷鍵Ctrl+B進行生成代碼,生成的代碼會有一個報告,包含模型的配置信息。在左邊的框中提示了本次生成代碼的文件,點擊可以對代碼進行查看。生成ert_main.c文件包含了一些模型的初始化并調(diào)用模型的主函數(shù),正常開發(fā)過程中這個文件是不會被用到。Main函數(shù)正常都在芯片開發(fā)環(huán)境中編寫。接口與調(diào)度這部分內(nèi)容會在后面的文章中詳細敘述,敬請關(guān)注。GenerateCode.c文件則就是存放Simulink模型生成代碼的文件,還有若干個h文件和Simulink自帶的引用文件。
GenerateCode_Step函數(shù)中,就是Simulink模型生成C語言代碼,可以看到這里的輸入與輸出都是以結(jié)構(gòu)體的形式進行表達的,k值則是在WorkPlace中直接賦值。這樣的代碼可讀性比較低,接下來就對模型進行更多的優(yōu)化設置。
在Simulink數(shù)據(jù)管理器中使用mpt.Signal添加4個變量,分別命名為x、y、z、k設置數(shù)據(jù)類型、存儲方式等,并且對k賦予初始值。
選中信號線并右鍵進入properites【屬性】對話框,在SignalName中輸入剛剛創(chuàng)建的變量名,并勾選Signal name must resolveto Simulink signal object。
設置后的模型效果,可以看到這時候信號線上多了個關(guān)聯(lián)圖標并再次對模型生成代碼。
生成后的代碼就可以看到與第一次生成的相比,那幾個晦澀難懂的結(jié)構(gòu)體已經(jīng)被具體的變量名取代了。以上這個部分很重要,這是后續(xù)接口層開發(fā)的要點。
函數(shù)的封裝
手工寫過代碼的朋友一定有這樣的經(jīng)驗,盡可能的要把相同邏輯的代碼用一個函數(shù)封裝起來。這樣既可以很方便地調(diào)用代碼,也能夠減少代碼冗余提高執(zhí)行效率。同樣的使用Simulink建模也需要考慮這個問題。
對剛剛的模型進行簡單的封裝,并復制一個出來。兩個子系統(tǒng)中的邏輯都是z=(x+y)*k,區(qū)別僅僅是輸入與輸出不同。
右鍵對Subsystem模塊屬性進行設置,勾選【Treat as atomic unit】設置為原子子系統(tǒng),并自定義一個函數(shù)名。
生成代碼后可以看到,左邊兩個Subsystem均調(diào)用了同一個函數(shù)。
生成代碼的設置
生成代碼的設置除了上面的選擇編譯模板一定要配置外,下面這幾個選項也是需要注意的。
如果比較細心的朋友會發(fā)現(xiàn)前面生成報告的硬件信息為Intel->x86-64 (Windows64),在模型設置中可以對設備進行指派,設置芯片的廠家、型號、各數(shù)據(jù)類型的數(shù)據(jù)長度、甚至字節(jié)序。
另外這部分是很容易被忽略的,這里可以根據(jù)不同的C語言標準來生成代碼,支持C99和C89標準。做嵌入式開發(fā)的朋友一定要根據(jù)自己的開發(fā)環(huán)境來選擇,如使用code warrior 5.2的朋友一定要選擇C89,選擇C99就會出現(xiàn)編譯錯誤的問題。
更多內(nèi)容
更多的基礎設置及細節(jié)問題可以向思想索取Matlab官方培訓視頻及思想對該視頻的學習筆記ppt