到目前这个阶段,不知道你是否注意到存储类(Storage Classes),即在创建数据字典后,新增变量或参数,如果选择存储类,生成的代码会怎么样?如果未选择存储类,生成的代码又会怎么样?本文就此进行介绍。
1 存储类
Simulink数据字典中的存储类控制着数据存储的位置和方式,影响代码生成的具体形式。具体而言,存储类控制着代码中的变量声明、变量定义、宏等代码生成;特别地,还控制部分数据类型、数据函数、编译器指令等功能,可以说存储类与代码的编译、链接环节关系紧密,不同的变量声明和定义,编译器会有不同的操作。
下面对常用存储类及其用法稍作说明:
1)Auto:存储类的第一个选项就是Auto,即自动。从字面上看不出来究竟是什么,通过生成代码观察生成的c文件可以看出,lookup table的xy轴是以结构体变量的成员出现。这个结构体的定义又是在Sample1.h中完成的如下所示。
对于模型的输入也是如此,如果模型有多个输入,存储类为Auto,那么也会以结构体形式定义中多个对应的成员,如下图划红线的结构体。通过对生成的代码分析,那么Auto的方式一般不会使用。
2)Imported Extern:将存储类设置为Imported Extern,则表示这个变量是外部引入。通过生成的代码可以看出step函数中用到了这些变量,但是并没有在本文件中定义这个变量。
打开Sample1_private.h可以看到,在这个头文件中外部声明了这些变狼。也就是说,别的文件中定义了它们,总的来说,这个选项还是比较适用于输入端口的代码生成的。
3)Exported Global:将存储类设置为Exported Global,即将其输出为全局变量。这里通过生成的代码可以看到直接把这些变量定义出,不是像之前那样定义为结构体。
5)Volatile:用于定义那些在程序运行期间可能会被程序之外的因素(如硬件中断、其他线程)修改的变量。使用 volatile 存储类可以确保编译器不会对这些变量进行优化,每次访问时都会从内存中读取最新的值,从而保证数据的一致性和正确性。
标定量确实可能被外部因素(如硬件设备、其他进程)修改,并且需要实时反映这些变化。比如这里考虑到滚动系数查表可标,因此将其X轴和Y轴的存储类都设置为Volatile。当然如果需要严格控制修改过程,可能会使用const volatile。
对于上述使用Const存储类的常量,也常使用存储类Define使用define定义则在编译时需要解析的常量,这些常量通常用于宏定义,以便在生成的代码中直接替换为具体的值,而不是作为变量存在于内存中。使用 define 存储类可以提高代码的可读性和效率,减少内存占用。
2 生成代码
3 小结
以上就是结合ECU应用层软件模型关于Simulink数据字典中最常使用的存储类的介绍。对于实际的ECU应用层软件模型,通常当前的预设存储类是不够的,需要自定义存储类,这块将涉及到memory map,后续继续深入这个话题,一起探讨下实际的ECU应用层软件模型都需要自定义哪些存储类。
汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。