Sinmulink代碼生成基礎體驗教程

本文轉(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,658評論 1 32
  • 機器學習術(shù)語表 本術(shù)語表中列出了一般的機器學習術(shù)語和 TensorFlow 專用術(shù)語的定義。 A A/B 測試 (...
    yalesaleng閱讀 2,146評論 0 11
  • 無止境的復合增長注定了社會階層的必然分化,也注定了社會矛盾不管對于任何一種社會經(jīng)濟體制都必然尖銳。而新技術(shù)的發(fā)...
    南瓜不加糖閱讀 4,429評論 0 0
  • 從大學畢業(yè)到現(xiàn)在我一直從事SEO優(yōu)化崗位,幾年時間,經(jīng)歷了大大小小的上百次面試邀請,其中的心酸只有自己知道。比如,...
    風中尋夢閱讀 233評論 2 5
  • 以下皆為舉例說明 選擇器靈活使用,可以使得選擇元素更加精準和快速;還有一種選擇器,可以在ID和類中指明元素前綴,比...
    sky丶星如雨閱讀 309評論 0 0

友情鏈接更多精彩內(nèi)容