目录
4. 在数据字典SLDD和Base Workspace里调用自定义的Storage Class
1. 问题引入
1. 定义变量到指定的段
开发过程中,需要把标定量放到指定的段中并生成代码,代码效果如下,在应用层都是基于模型开发的前提下,如果手动添加#pragma section 这种预编译指令是不现实的,本文记录一下代码生成的配置过程。
2. 批量把SLDD里面定义的变量放到指定的段
如果已经定义了数据字典,并定义了很多变量需要放到特定的段中
#pragma section ".rodata.Calib_32" a 4
/* Definition for custom storage class: Section_32_Signa */
VAR(float32, Task_100us_VAR) Ialpha; /* '<S14>/Gain2' */
VAR(float32, Task_100us_VAR) Ibeta; /* '<S14>/Gain5' */
VAR(float32, Task_100us_VAR) V_alpha; /* '<S9>/Add' */
VAR(float32, Task_100us_VAR) V_beta; /* '<S9>/Add3' */
VAR(float32, Task_100us_VAR) Vd_voltage;/* '<S39>/Switch2' */
VAR(float32, Task_100us_VAR) Vq_voltage;/* '<S66>/Switch2' */
#pragma section
/* ConstVolatile memory section */
#pragma section ".rodata.Calib_32" a 4
/* Definition for custom storage class: Section_32_Param */
volatile CONST(Current_PI_Param, Task_100us_VAR) Current_PI = {
0.84F,
48.0F,
1.869F,
48.0F
} ;
#pragma section
2.配置过程
1. 创建自定义的Storage Class
在matlab的安装目录找到如下+SimulinkDemos的文件夹,直接复制到当前模型的工程中并改名,这里我们改成+myPackage,并把文件夹添加到matlab的路径中
如图,已经改名并添加了路径
2. 分别对+myPackage包里面Signal.m 和Parameter.m进行调整,两个文件分别对应了Simulink中的Signal类型和Parameter类型,如果少改了一个,在遇到相应类型时不能正常生成相要的代码。
3. 创建自定义的Storage Class
在当前工作空间输入 cscdesigner('myPackage'),弹出如下窗口,其中Memory Section是定义代码生成模板,Custom Storage Class是定义Simulink变量Storage Class
1. 配置Memory Section
这里配置Signal类型的段和Parameter的段如下图:
Signal类型:
Parameter类型:
配置完成后 Apply
2. 配置Custom Storage Class
新建一个模板,也可以复制已有的模板进行更改
Parameter类型操作也是一样
最后点Apply,到这一步自定义的Storage Class就完成了
4. 在数据字典SLDD和Base Workspace里调用自定义的Storage Class
1. 打开Model Explorer窗口,找到Add Simulink Parameter旁边的小箭头,展开如下,点击Customize class lists
2. 如下图,选择定义好的myPackage.Signal 和 myPackage.Parameter, 最后点OK
3. 现在可以在Base Workspace 各 SLDD的 Design Data 里面使用自定义的Storage Class
5. 更改数据字典里面已经定义好的变量
如果数据字典里面已经定义了变量,在调用自定义的Storage Class时是不会显示出我们自定义的Storage Class如下:
在调整StorageClass属性时,找不到我们定义的StorageClass,因为我们在建数据字典时最初用的是Simulink.signal或者是Simulink.parameter,并不是我们定义的。这时候我们可以手动去改,重新定义变量,但这对变量多且有很多结构体的情况下并不适用,这时候就可以用到Export功能,如下:
1. 把数据字典里的数据导出到文件,得到一个.m, 这个.m就是数据字典里定义的变量的脚本
2. 把变量从Simulink.Parameter或者Simulink.Signal改成 myPackage.Parameter 或者myPackage.Signal. 再点下运行,这时新的变量会出现在Base Workspace.
3. 备份原先的数据字典,清空数据字典里的变量,再从Base Workspace里面导入新的变量,现在的变量就可以直接调用自定义的StorageClass
6. 生成代码验证
7.总结
这是在实践中遇到的问题,并通过查找相关资料和尝试找到的解决方案,不代表这是最好的方法,在这里记录一下