上次介紹過(guò)可以使用Variant Subsystem或者M(jìn)odel Variant實(shí)現(xiàn)帶有條件編譯的代碼(條件編譯助力Simulink模型平臺(tái)化開(kāi)發(fā))。最近了解到,從MATLAB R2016a開(kāi)始,又有一種新的方式可以實(shí)現(xiàn)C代碼中的條件編譯。這就是Variant Sourc模塊的使用。
假設(shè)有如下模型:
雙擊Variant Source模塊,可以看到如下配置界面:
不難看出,除了要定義Simulink Variant對(duì)象K1、K2之外,還需要勾上Analyze all choices during update diagram and generate prepropcessor conditionals選項(xiàng)。顯然,如果K==1條件成立,則Port 1分支對(duì)應(yīng)的代碼被編譯,如果K==2,則Port 2分支對(duì)應(yīng)的代碼被編譯。這里的K可以定義為Simulink Parameter對(duì)象,Storage Class定義為Define(Custom),并且需要指定宏定義的文件。
如此設(shè)置之下,得到的模型算法實(shí)現(xiàn)函數(shù)如下:
voidtestvariantSource_step(void)
{
real_T rtb_VariantMerge_For_Variant_So;
#ifK1
rtb_VariantMerge_For_Variant_So = u1 + u2;
#endif
#ifK2
rtb_VariantMerge_For_Variant_So = u3 + u4;
#endif
y = rtb_VariantMerge_For_Variant_So;
}
這種方式實(shí)現(xiàn)帶有條件編譯的代碼也非常簡(jiǎn)單,條件編譯的好處可以通過(guò)控制宏定義K控制需要編譯哪部分代碼,那么,如果不設(shè)置條件編譯呢?
上述模型中,如果不再勾選Analyze all choices during update diagram and generate prepropcessor conditionals選項(xiàng),我們得到如下代碼:
voidtestvariantSource_step(void)
{
y = u1 + u2;
}
代碼中只有當(dāng)前參數(shù)條件下有效算法的代碼。
跟上次介紹的條件編譯相比,實(shí)現(xiàn)方式不同,應(yīng)用場(chǎng)景也可能不同,如何取舍,這里就不去分析了。但是,在基于模型的開(kāi)發(fā)模式下,到底在模型級(jí)別上做選擇,還是通過(guò)C代碼級(jí)別的條件編譯做選擇,這是個(gè)值得我們思考的問(wèn)題。
-
代碼
+關(guān)注
關(guān)注
30文章
4896瀏覽量
70571 -
編譯
+關(guān)注
關(guān)注
0文章
677瀏覽量
33931
發(fā)布評(píng)論請(qǐng)先 登錄
PanDao:實(shí)際約束條件下成像系統(tǒng)的初始結(jié)構(gòu)的生成
VirtualLab Fusion案例:K域和X域中的系統(tǒng)建模
使用OpenVINO?條件編譯功能,壓縮Windows應(yīng)用體積

VirtualLab Fusion:系統(tǒng)建模分析器
仿真分析誤差來(lái)源及減少建模誤差的方法

一種面向飛行試驗(yàn)的數(shù)據(jù)融合框架

一種利用CSD16327Q3實(shí)現(xiàn)企業(yè)固態(tài)硬盤(pán)鉭電容短路保護(hù)的方法

一種簡(jiǎn)單高效配置FPGA的方法

linux驅(qū)動(dòng)程序的編譯方法是什么
LIDAR激光雷達(dá)逆向建模能用到revit當(dāng)中嗎
對(duì)放大電路的分析方法介紹
一種無(wú)透鏡成像的新方法

評(píng)論