本文研究了自定义Storage Class配置的方法(cscdesigner),并通过生成代码验证了自定义的方法。
1 问题引入
在之前的一篇博客《Simulink代码生成: Storage Class配置》中,研究了很多Matlab中自带的Storage Class以及生成的代码。最近博主工作中遇到了一个新的需求,需要用#pragma section把全局变量定义到某个特定的段中。具体形式如下:
#pragma section ".bss.ram0.a1" awB
uint16_T Signal1;
#pragma section
- 1
- 2
- 3
这三行C代码表示,要把Signal1这个全局变量定义到ECU的".bss.ram0.a1"区段中。如果使用ExportToFile的的Storage Class来生成代码,是不会包含#pragma指令的。
想解决这个问题有两种思路:
- 方案1:手动修改模型生成的代码,或者用脚本给C代码中批量加上#pragma指令;
- 方案2:想办法通过配置Simulink,使之自动生成这个#pragma指令;
其中,方案1是下下策。一般来说,在MBD中不应该手动修改生成的代码,这样非常容易造成版本管理的混乱,难以追溯问题。所以,博主通过Matlab帮助文件研究了cscdesigner,实现了方案2。
2 配置过程
本章节会根据第1章的需求,来演示配置自定义Storage Class的过程。
2.1 新建数据类型包
1)进入Matlab安装路径的 oolboxsimulinksimdemosdataclasses路径下,找到+SimulinkDemos文件夹
2)将+SimulinkDemo文件夹拷贝到Matlab当前路径,重命名为+myPackage
3)打开文件夹中的Signal.m,对下图中的method定义取消注释,并把packageName改成myPackage,保存m文件。
改完以后如下图:
methods
function setupCoderInfo(h)
% Use custom storage classes from this package
useLocalCustomStorageClasses(h, 'myPackage');
end
end % methods
- 1
- 2
- 3
- 4
- 5
- 6
4)对Parameter.m进行和第3步同样的操作,这里不再赘述
到了这一步,就已经建立好了我们自己的数据类型包myPackage
2.2 新建Storage Class
1)切回到+myPackage所在的路径,在Matlab命令行输入如下指令
>> cscdesigner('myPackage')
- 1
然后就会弹出Custom Storage Class的设计界面,并自动把Package切换成刚刚新建的myPackage
2)切换成Memory Section选项卡,选中Default,点击右侧的Copy。然后就会复制出一个Default的Memory Section定义。
3)把新的MemorySection改名为Default_RAM0,并且在Pre statement和Post statement中填写上#pragma指令。Apply以后,右侧的预览界面会显示出该配置下对应生成代码的模板。
4)窗口切换到Custom Storage Class,选中ExportToFile,点击右侧的Copy。这样就会拷贝一个新的ExportToFile。
5)把新的Custom Storage Class改名为ExportToFile_RAM0,把下面的Memory Section选为之前定义的Default_RAM0。Apply以后,右侧的预览界面会显示出该配置下对应生成代码的模板。
6)最后点击Save和OK,新建Storage Class就完成了。
3 生成代码验证
本章节通过建模和生成代码来验证上文配置的自定义StorageClass。
1)在Matlab命令行中输入命令,在工作空间中新建一个信号Signal1.
>> Signal1 = myPackage.Signal;
- 1
2)双击打开工作空间中的Signal1,配置Datatype为single,配置Storage Class为ExportToFile_RAM0。
3)新建一个Simulink模型,做一个简单的输入输出和Gain,把输出信号线命名为Signal1,并配置为Resolve,也就是左侧的小叉子。这样的话,模型的输入信号就配置为工作空间的Signal1了。
4)简单配置一下Embedded Coder,并生成代码,可以在Global.c文件中看到已经自动生成了#pragma指令。
4 总结
本文中的例子比较简单。在cscdesigner的帮助文件中可以看到,自定义Storage Class有很大的操作空间,等到有其他需求的时候再深入研究。
评论记录:
回复评论: