概述
文章目录
前言
一、Simulink实现数据流处理
二、自动生成C代码
三、变式1
四、变式2
五、变式3
总结
前言
近期在做的项目用到了Simulink自动生成代码,图形化编程语言相比文本类编程语言的优势是,逻辑思路和数据流清晰了很多,劣势是程序执行的时序不明显,而且各个模块的配置操作使编程的灵活度下降了不少,在使用习惯上面总感觉有各种限制。今天就深入地拆解一下Simulink中最基础的几个编程模块,尽量在以后的使用中发扬它的优势,避开劣势。
一、Simulink实现数据流处理
用Simulink处理数据流的一个最简单编程举例如下:
二、自动生成C代码
上述处理数据流的Simulink自动生成的对应C代码如下:
uint8_T rtb_Output;
/* UnitDelay: '<S3>/Output' */
rtb_Output = CodeGenerate_DW.Output_DSTATE;
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */
/* Outport: '<Root>/y' incorporates:
*
Gain: '<S2>/Gain'
*/
CodeGenerate_Y.y = (uint16_T)(160U * rtb_Output);
三、变式1
基于上述举例,把源数据整体做一个偏移参数”2”,生成的对应代码如下所示:
/* Outport: '<Root>/y' incorporates:
*
Constant: '<S2>/Constant'
*
Gain: '<S2>/Gain'
*
Sum: '<S2>/Add'
*
UnitDelay: '<S3>/Output'
*/
CodeGenerate_Y.y = ((real_T)CodeGenerate_DW.Output_DSTATE + 2.0) * 10.0;
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */
四、变式2
基于上述举例,把数据流处理的结果从double型转换成bool型,生成的对应代码如下所示:
/* Outport: '<Root>/y' incorporates:
*
Constant: '<S2>/Constant'
*
DataTypeConversion: '<S2>/Data Type Conversion'
*
Gain: '<S2>/Gain'
*
Sum: '<S2>/Add'
*
UnitDelay: '<S3>/Output'
*/
CodeGenerate_Y.y = ((CodeGenerate_DW.Output_DSTATE - 2) * 10 != 0);
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */
五、变式3
基于上述举例,把数据流处理的结果做两个周期的延时,生成的对应代码如下所示:
int32_T rtb_Var2;
/* Outport: '<Root>/y' incorporates:
*
Delay: '<S2>/Delay'
*/
CodeGenerate_Y.y = CodeGenerate_DW.Delay_DSTATE[0];
/* Gain: '<S2>/Gain' incorporates:
*
Constant: '<S2>/Constant'
*
Sum: '<S2>/Add'
*
UnitDelay: '<S3>/Output'
*/
rtb_Var2 = (CodeGenerate_DW.Output_DSTATE - 2) * 10;
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */
/* Update for Delay: '<S2>/Delay' incorporates:
*
DataTypeConversion: '<S2>/Data Type Conversion'
*/
CodeGenerate_DW.Delay_DSTATE[0] = CodeGenerate_DW.Delay_DSTATE[1];
CodeGenerate_DW.Delay_DSTATE[1] = (rtb_Var2 != 0);
总结
以上就是本人拆解Simulink模块自动生成代码时,首先讲解的第一部分。主要针对Simulink的数据流处理模块,展示了这些模块的使用方法,并对比了相应的C代码。
后续还会更新Simulink其他的几种模块,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成为笔者持续分享的动力。
另外,上述例程使用的Demo工程可以到笔者的主页查找和下载。
版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!
最后
以上就是朴实小蜜蜂为你收集整理的深入拆解Simulink自动生成代码(一)——数据流处理文章目录前言一、Simulink实现数据流处理二、自动生成C代码三、变式1四、变式2五、变式3总结的全部内容,希望文章能够帮你解决深入拆解Simulink自动生成代码(一)——数据流处理文章目录前言一、Simulink实现数据流处理二、自动生成C代码三、变式1四、变式2五、变式3总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复