ECU 应用层软件模型之数据字典存储类6

文摘   2024-11-27 07:21   上海  

ECU 应用层软件模型系列文章不断更新中,从零开始教你做应用层开发:


到目前这个阶段,不知道你是否注意到存储类(Storage Classes),即在创建数据字典后,新增变量或参数,如果选择存储类,生成的代码会怎么样?如果未选择存储类,生成的代码又会怎么样?本文就此进行介绍。

1 存储类

Simulink数据字典中的存储类控制着数据存储的位置和方式,影响代码生成的具体形式。具体而言,存储类控制着代码中的变量声明、变量定义、宏等代码生成;特别地,还控制部分数据类型、数据函数、编译器指令等功能,可以说存储类与代码的编译、链接环节关系紧密,不同的变量声明和定义,编译器会有不同的操作。

存储类的管理工具主要是数据字典,就如上图所示,在“Embedded Coder Dictionary”窗口中,可以看到Simulink预设了多种存储类。另外设置存储类需要借助“Code Mappings - C”窗口,在这个窗口中,可以为模型中的信号和参数选择合适的存储类。比如可以将某个信号设置为ExportToFile存储类,将变量定义在单独的.c文件中,并在头文件中声明为extern,适用于需要在多个文件中共享的全局变量。

下面对常用存储类及其用法稍作说明:

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,即将其输出为全局变量。这里通过生成的代码可以看到直接把这些变量定义出,不是像之前那样定义为结构体。

而且是在模型对应的c文件内定义的这些变量,在对应的.h文件中用extern关键字对这些变量进行外部声明,也就是说只要别的c文件包含了这个Sample1.h,就可以使用这些全局变量。个人认为,Exported Global比较适合用于输出的信号线,因为输出的信号是自己的模型产生的,而输入的信号通常是别的模型产生的。
4)Const: 用于定义那些在程序运行期间不应该被修改的变量。这些变量通常是一些固定的常量,例如物理常数、系统参数、预设值等。使用 const 存储类可以提供编译时的安全性,防止意外修改,从而确保系统的稳定性和可靠性。比如这里我们可以将车辆的整备质量,迎风面积和迎风系数设定为Const类型,因为对于某个车型而言,它们确定之后就不会变了。

5)Volatile:用于定义那些在程序运行期间可能会被程序之外的因素(如硬件中断、其他线程)修改的变量。使用 volatile 存储类可以确保编译器不会对这些变量进行优化,每次访问时都会从内存中读取最新的值,从而保证数据的一致性和正确性。

标定量确实可能被外部因素(如硬件设备、其他进程)修改,并且需要实时反映这些变化。比如这里考虑到滚动系数查表可标,因此将其X轴和Y轴的存储类都设置为Volatile。当然如果需要严格控制修改过程,可能会使用const volatile。

对于上述使用Const存储类的常量,也常使用存储类Define使用define定义则在编译时需要解析的常量,这些常量通常用于宏定义,以便在生成的代码中直接替换为具体的值,而不是作为变量存在于内存中。使用 define 存储类可以提高代码的可读性和效率,减少内存占用。

在ECU应用层软件模型开发项目中,这里主要就介绍这几个与输入信号,输出信号,常量、观测量和标定量相关的存储类。如有兴趣可以自行研究其他类型,总的来说,预设的存储类是不可编辑的,如果当前的这些存储类满足不了项目的要求,可以通过左上角的“Add”按钮新建自定义存储类。

2 生成代码

当定义好了各变量和常量的存储类之后,进行代码生成,如下所示:


3 小结

以上就是结合ECU应用层软件模型关于Simulink数据字典中最常使用的存储类的介绍。对于实际的ECU应用层软件模型,通常当前的预设存储类是不够的,需要自定义存储类,这块将涉及到memory map,后续继续深入这个话题,一起探讨下实际的ECU应用层软件模型都需要自定义哪些存储类。


创作不易,欢迎关注点赞再看收藏


汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。

谦益行
分享汽车研发日常,助力你我共同成长。
 最新文章