無論是Simulink仿真,還是對模型做代碼生成,已有C代碼的調(diào)用都是我們經(jīng)常會遇到的情形:
如何調(diào)用現(xiàn)有的外部C代碼?
很多人首先想到的是S-Function。的確,S-Function提供了一種途徑,可以讓我們把C函數(shù)封裝成Simulink模塊在Simulink環(huán)境下運(yùn)行。另外還有一種方式,叫做Legacy Code Tool,說白了也是S-Function,只是MATLAB提供了這樣的接口便于用于實(shí)現(xiàn)S-Function封裝。這兩種做法都不是我要介紹的。
我想跟大家說的是更方便的方法:
使用Stateflow調(diào)用外部C代碼。
假設(shè)有兩個文件,myfile.c和myfile.h。其中myfile.c中定義了一個全局函數(shù)和全局變量,如下:
#include "myfile.h"
double x;
double myfun(double a, double b)
{
return a +b;
}
myfile.h文件是對全局函數(shù)myfun()和全局變量x的聲明。
假如我已經(jīng)為Chart定義了兩個輸入input1和input2,一個輸出output,那么Stateflow里你就可以像下面這樣使用這個函數(shù)和變量:

除此,你不僅可以使用flowchart去調(diào)用外部C代碼,你也可以在狀態(tài)機(jī)里調(diào)用外部代碼,如下圖:

當(dāng)然,如果要做到上述直接調(diào)用C代碼,需要做如下幾點(diǎn)設(shè)置:
把Stateflow的動作語言(Action Language)設(shè)置為C;
打開如下界面進(jìn)行如圖示的配置

以上是針對新版本MATLAB的界面。
對于老版本的MATLAB,在Simulation Target下面,還有一層Custom Code,作用和新版本是一樣的。
這里我們有三個地方可以設(shè)置,Insert custom C code in generated,這下面的幾個欄,都是把右側(cè)編輯框里的文本信息插入到Stateflow生成的Source file、Header file以及Initialize function和Terminate function里面。
說到這里很多人可能會迷糊了,Stateflow要生成代碼?沒錯,Stateflow的運(yùn)行不同于Simulink模塊,Simulink模塊可以事先定義好各種行為或者動作,而Stateflow chart里面的設(shè)計可能千差萬別,沒法事先定義chart的行為,所以在運(yùn)行Stateflow chart的時候,首先需要把這個chart轉(zhuǎn)成S-Function格式的C代碼,然后編譯成動態(tài)鏈接庫文件(MATLAB里面擴(kuò)展名是mexw32或者mexw64,32或者64取決于MATLAB的位數(shù)),而這個插入代碼就發(fā)生在從chart轉(zhuǎn)成C代碼的過程中。比如,按照上圖的設(shè)置,在生成的C代碼的頭文件中會有一行代碼 #include “myfile.h”。
另外,Additional build information里面,需要指定路徑,在Include directories里面給出要編譯的C文件的路徑,如果C文件和模型在同一路徑下,也可以不指定;在Source files里面,給出要編譯的C文件myfile.c。這部分內(nèi)容,是告訴編譯器和鏈接器需要編譯的C文件在什么路徑下以及需要編譯哪些自動生成的文件之外的C文件。
說到底,對于現(xiàn)有C代碼的調(diào)用,無論是自己編寫S-Function,還是使用Legacy Code Tool創(chuàng)建S-Function模塊,或者使用Stateflow,最終的實(shí)現(xiàn)方式都是S-Function(動態(tài)鏈接庫)相比之下,使用Stateflow會更便利、更直觀一些。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4422瀏覽量
67850 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29568 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
15237
發(fā)布評論請先 登錄
知識分享 | 如何通過建模規(guī)范輕松掌控Stateflow開發(fā)
在Keil中進(jìn)行C代碼與匯編代碼的混合編程
c語言中的代碼優(yōu)化
控制流和函數(shù)調(diào)用的精細(xì)調(diào)整
求助,關(guān)于C代碼中的printf打印的疑問求解
Python調(diào)用API教程
RVMCU課堂「12」: 手把手教你玩轉(zhuǎn)RVSTAR—外部中斷篇
關(guān)于系統(tǒng)鏈接腳本的介紹
京東商品詳情接口實(shí)戰(zhàn)解析:從調(diào)用優(yōu)化到商業(yè)價值挖掘(附避坑代碼)
CW32L012實(shí)現(xiàn)外部flash下載算法
GCC編譯器,怎么才能實(shí)現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯呢?
Stateflow模型測試典型問題分享——不可達(dá)的分支
關(guān)于使用Stateflow調(diào)用外部C代碼的教程介紹
評論