基于模型设计软件,尤其是Simulink工具下建立的模型在ert.tlc系统目标下生成的C代码,往往由于种种原因,使得生成代码的规模较大,先不说编译之后的目标文件在各种硬件平台里面占用ROM多大,运行时RAM多大,单单生成代码的行数过多,就已经是让很多产品控制器开发人员难以接受的了。Simulink模型生成代码行数过多,有很多原因,如表达式折叠关闭、模型中存在太多冗余逻辑,总的来说包括两大类:配置问题和重复建模问题,配置问题的解决依赖于对Simulink代码生成参数的深度理解;而重复建模的问题,则是比较容易解决的。使用可重用子系统将重复逻辑封装为可重用子系统即可立竿见影。
举一个最理想的例子(如上图),将不带有状态变量(unti delay之类模块会将内部离散状态变量生成独立的全局变量)的组合逻辑封装为可以重复调用的原子子系统,但是只生成一份函数定义。为了实现这个目标,推荐将可以重复使用的算法逻辑封装为原子子系统,并在“代码生成”页面下分别设置“函数打包”“函数名称选项”“函数名称(任意合法字符串,不必须如图所示)”“文件名选项”如下:
然后,点击确定完成重用子系统生成代码的配置。将此子系统拷贝多份,构成新的模型如下图(包含所设置原子子系统的3个实例),然后Ctrl+B启动代码生成(为了方便观看效果,模型关闭了生成注释的功能)。
模型生成代码中,设置的原子子系统生成函数myFun只有一个定义,但是在Model_Step函数中被调用三次。如果不设置重用,那么生成代码里面实现不了如此简洁的效果。
而这个函数myFun是生成在单独的文件myFun.c和myFun.h中的,这是因为设置函数生成文件设置的参考函数名的效果。
通过上面这个简单的例子,希望让初学者了解建模过程中的设计和配置,对生成代码规模长度是有直观影响的,千万不要放松对建模技术的重视度。
PS:即使让Simulink生成代码只有一行也是有办法的,参考校长的产品Code Line Reducer工具功能。
|