Simulink 模型的自動(dòng)代碼生成?
簡(jiǎn)單來(lái)說(shuō),在我們的 “大” 項(xiàng)目中,需要實(shí)現(xiàn)很多算法,其中比如 myfilter。
現(xiàn)在不手寫(xiě)C了,而是搭建Simulink框圖。對(duì)那些算法比C語(yǔ)法熟悉的人來(lái)說(shuō),這是個(gè)福音。
算法實(shí)現(xiàn)方便,測(cè)試方便
Simulink 模型的測(cè)試驗(yàn)證非常重要,然而這里不討論。
總之,算法沒(méi)問(wèn)題之后,通過(guò)自定代碼生成工具Coder“翻譯”成C代碼,跟手寫(xiě)的一樣.c.h,還可以控制函數(shù)原型、數(shù)據(jù)定義、文件結(jié)構(gòu)、甚至注釋......
把自動(dòng)生成的源文件集成到原來(lái)的項(xiàng)目文件中。
由各種編譯器,把它們編譯成不同的可執(zhí)行文件,最后運(yùn)行在不同的環(huán)境。
比如這里就是通過(guò) VS 編譯成 exe,很簡(jiǎn)單吧。
所以
對(duì)于代碼生成的任務(wù)來(lái)說(shuō)
重點(diǎn)在如何生成自己想要的C代碼
但經(jīng)常會(huì)有人問(wèn),Coder支持哪些板子?
看下面這張嵌入式軟件的偽代碼的簡(jiǎn)單示意圖。
Simulink 算法模型通過(guò) Coder 生成的是藍(lán)色部分,標(biāo)準(zhǔn)C;跟硬件打交道的底層驅(qū)動(dòng)黑色部分,是手寫(xiě)代碼。
既然叫Coder,所以本質(zhì)上,它的本職工作就是Simulink模型到C代碼這個(gè)步驟,就結(jié)束了。至于C要通過(guò)什么編譯器跑到什么硬件上,跟Coder沒(méi)多大關(guān)系。
那么
為什么會(huì)有人問(wèn)這個(gè)問(wèn)題呢?
Build Process
Coder除了把模型翻譯成代碼的本職工作以外,還額外張羅了一些Build的任務(wù),把C代碼變成可執(zhí)行文件。
為什么說(shuō)張羅,而不說(shuō)完成呢,因?yàn)镃oder本身并沒(méi)有編譯的功能,它會(huì)后臺(tái)調(diào)用你安裝了的編譯器來(lái)實(shí)現(xiàn) ,看下圖。
比如默認(rèn)下,Coder會(huì)調(diào)用VC,使用它內(nèi)置的相應(yīng)的main文件模板,然后編譯。這就是為什么每次生成代碼,在當(dāng)前目錄下就會(huì) “莫名其妙” 的生成一個(gè)exe程序。如果你不喜歡,那也可以 “Generate code only”。
如果是上面沒(méi)列的編譯器,自己也可以把它集成進(jìn)來(lái),比如構(gòu)造個(gè)Template makefile,描述怎么編譯鏈接變成可執(zhí)行文件。
好像還是沒(méi)解釋所謂硬件支持的問(wèn)題?
I/O Drive blocks
剛才說(shuō)的是后臺(tái)可以調(diào)用編譯器,構(gòu)造main文件,生成了可執(zhí)行文件,下載到硬件。
在很久很久以前,代碼生成工具為一些板卡提供了I/O驅(qū)動(dòng)模塊庫(kù),TIC2000/5000/6000,等等。
然后可以做什么?
看下面這張圖,兩端的In/Out就換成圖中的硬件驅(qū)動(dòng)模塊。舉例的板卡的驅(qū)動(dòng)庫(kù)我沒(méi)裝,暫時(shí)拿Arduino的庫(kù)示意一下,提供了很多下圖中紅框類(lèi)似的模塊。
那么,中間用Simulink/Stateflow搭好算法,兩頭的輸入輸出端口連接上這些硬件驅(qū)動(dòng)模塊,后臺(tái)又做好了編譯工具鏈的支持,就可以實(shí)現(xiàn)傳說(shuō)中的支持某款硬件:一鍵下載到硬件上運(yùn)行了。
如果使用這種方式來(lái)開(kāi)發(fā)產(chǎn)品,這樣看上去感覺(jué)真的很美好~
但是,目測(cè),要做的額外的工作也非常多,所有的要用到的驅(qū)動(dòng)都需要包裹成Simulink Block的形式,要自動(dòng)生成所需要的main文件,等等,這也是不小的工作量。
做產(chǎn)品開(kāi)發(fā),使用哪種 “集成” 方式,仁者見(jiàn)仁。
現(xiàn)在就Coder工具來(lái)說(shuō),這部分 “對(duì)硬件的支持” 從Coder里剝離了,變成了免費(fèi)的Hardware Support Package下載。用來(lái)做做算法的原型測(cè)試也不錯(cuò)。
另一個(gè)經(jīng)常會(huì)問(wèn)的問(wèn)題:
代碼生成工具的效率怎么樣?
雖然Coder習(xí)慣叫代碼生成工具,但它實(shí)際上是個(gè)代碼翻譯工具,把Simulink模型“翻譯”成C代碼。
其實(shí)就跟金山詞霸,谷歌翻譯一樣,基于你寫(xiě)的中文翻譯成英文。
“今日天朗氣清,看似極好的日子,私心想若能約上三五好友,結(jié)伴出游,陶冶性情,便是再好不過(guò)了。”
再厲害的谷歌翻譯,也翻譯不出這句人話:“今天不想上班。”
所以對(duì)于Coder來(lái)說(shuō),也是一樣,它的目標(biāo)是C代碼如實(shí)的反映出你搭建的Simulink模型結(jié)構(gòu)所表達(dá)的信息。在考慮生成的C代碼效率如何時(shí),也不能忽略Simulink模型搭建的效率如何?
Simulink Coder生成的C代碼主要用于加速桌面仿真、快速原型、以及HIL測(cè)試(被控對(duì)象模型也要生成C代碼)。Embedded Coder提供了更多的自定義的途徑,生成高效率的嵌入式C代碼。
但其實(shí),對(duì)于我們用戶(hù)來(lái)說(shuō),這些Coder都是 “看不見(jiàn)” 的,沒(méi)有所謂打開(kāi)Embedded Coder工具箱的說(shuō)法。
我們只需要關(guān)心選擇哪一個(gè)系統(tǒng)目標(biāo)文件(System tareget file)。罷了,下圖。“無(wú)責(zé)任瞎猜一句”,為什么這些后綴名是.tlc呢?因?yàn)镃oder里面干翻譯這個(gè)活的叫TargetLanguageCompiler。
紅框外的.tlc只是針對(duì)各自不同的目標(biāo)稍作了些修改,完成一些額外的事。比如ert_shrlib.tlc,多做了一個(gè)工作,把生成的.c.h變成.dll。
這一個(gè)小節(jié)說(shuō)人話就是:選擇ert.tlc。
如果對(duì)于一些小算法你有什么高效率的實(shí)現(xiàn),也可以添加進(jìn)來(lái)。比如說(shuō)查表,比說(shuō)說(shuō)針對(duì)某個(gè)特殊器件的四則運(yùn)算,到時(shí)候Coder就會(huì)替換你的實(shí)現(xiàn)方式。
當(dāng)然,一些通用的提高代碼效率的方法,還是可以試試。讓 Coder 基于它的 “經(jīng)驗(yàn)”,給你一些通用的建議:
所以,對(duì)于代碼生成的任務(wù)來(lái)說(shuō),除了選擇ert.tlc,點(diǎn)個(gè)按鈕之外,再考慮下數(shù)據(jù)管理、代碼結(jié)構(gòu)、文件結(jié)構(gòu)......
-
嵌入式
+關(guān)注
關(guān)注
5152文章
19670瀏覽量
317530 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
14780
發(fā)布評(píng)論請(qǐng)先 登錄
無(wú)模型自適應(yīng)控制在永磁同步電機(jī)轉(zhuǎn)速中的仿真研究
十字形多自由度超聲電機(jī)接觸分析模型研究
如何實(shí)現(xiàn)MC33774IC在Simulink環(huán)境中使用基于模型的設(shè)計(jì)?
Simulink與 Simscape的結(jié)合使用
Simulink與 MATLAB 的結(jié)合使用 Simulink中的信號(hào)處理方法
Simulink模型仿真與分析技巧
Simulink自定義模塊開(kāi)發(fā)教程 Simulink 在控制系統(tǒng)中的應(yīng)用
NVIDIA推出全新生成式AI模型Fugatto
探索設(shè)計(jì)稿自動(dòng)生成Flutter代碼的技術(shù)方案

Matlab/Simulink/Stateflow建模開(kāi)發(fā)及仿真測(cè)試
AI大模型的最新研究進(jìn)展
源代碼解析工具與自動(dòng)化流程圖生成解決方案
新的 MathWorks 硬件支持包支持從 MATLAB 和 Simulink 模型到高通 Hexagon 神經(jīng)處理單元架構(gòu)的自動(dòng)化代碼生成
關(guān)于Makefile自動(dòng)生成-autotools的使用

評(píng)論