众所周知,软件和硬件的运行是不分家的。对于ECU应用层软件,不仅离不开ECU底层软件的支持,而且其运行也是无法离不开ECU硬件(微控制器)。汽车ECU硬件就是通常说的嵌入式控制器,比如英飞凌的Tricore系列,NXP的ST32K系列等。因此在这样的背景下,当进行Simulink模型的生成代码配置时,就必须配置指定的硬件,才能生成出符合该硬件的正确代码。接下来本文对此进行分享:在 ECU 应用层软件模型如何自动生成代码2 已经进行了最基本的生成代码配置,与硬件相关的生成代码配置配置参数左侧的硬件实现(Hardware Implementation),需要配置的选项有设备制造商(Device vendor)和设备类型(Device type), 这个配置根据项目所选择的硬件(微控制器)来,比如我所使用的是英飞凌的TC399,那么配置如下:- 确保兼容性:不同的硬件平台有不同的架构、字节序、数据类型大小等特性,因此需要通过配置硬件实现来确保生成的代码与目标硬件平台兼容。比如,有些嵌入式系统使用16位整数,而另一些则使用32位整数,此时如果不正确配置这些参数,生成的代码可能会在目标硬件上运行错误。
- 优化性能:配置硬件实现可以帮助Simulink生成更高效的代码。比如通过指定目标硬件的浮点运算能力,Simulink可以生成更优化的浮点运算代码,从而提高运行效率。
- 正确的数据处理:不同的硬件平台可能有不同的数据处理方式。比如有些嵌入式系统可能使用大端字节序(big-endian),而另一些则使用小端字节序(little-endian),因此配置硬件实现可以确保数据在传输和处理时不会出现字节序问题。
- 生成合适的启动代码:配置硬件实现后,Simulink可以生成适合目标硬件的启动代码,包括初始化外设、设置中断向量表等,这些启动代码是确保嵌入式系统正常运行的基础。
- 集成硬件库:许多嵌入式系统需要特定的硬件库来支持外设操作。配置硬件实现可以确保生成的代码能够正确调用这些库函数,从而实现对外设的控制。
- 内存管理:配置硬件实现可以指定内存的布局和管理方式,例如函数、常数、输入/输出、数据和参数的存储段,这有助于优化内存使用,避免内存冲突和溢出。
- 代码生成报告:配置硬件实现后,Simulink可以生成详细的代码生成报告,帮助开发者检查生成的代码是否存在潜在问题,例如未使用的变量、未初始化的内存等。
这里通过选取两种不同的硬件来再来对比一下,如下所示。明显可以看到随着硬件的不同,微控制器的位数有所不同,比如英飞凌Tricore的int数据类型长度是32bits,而飞思卡尔的DSP5685的int长度却是16bits,其他不同不在描述。2 代码生成
Ctrl+B进行代码生成如下,打开rtwtypes.h头文件可以看到许多typedef的类型定义。生成代码的基本数据类型的定义与Simulink中硬件实现中配置硬件设备的位数是一致的。注意这里使用typedef定义数据类型,其主要目的是为了增强代码的可读性、可维护性和跨平台性。
先从跨平台性说起,在不同的平台上,基本数据类型的大小可能会有所不同。使用typedef可以定义固定长度的数据类型,确保代码在不同平台上的一致性。就如上面英飞凌的int长度为32位,通过typedef,确知道了这个数据类型的长度信息,int32_T。
这样可以确保在不同平台上,int32_T始终表示32位整数。
然后是代码的可维护性,便于修改数据类型。比如需要更改某个数据类型的定义,使用typedef可以在一处修改,而不需要在代码中多处修改。例如,如果需要将int类型改为long类型,只需修改typedef声明即可。
这样可以避免在代码中多处修改,减少出错的可能性。
最后是增强代码的可读性,命名更加直观。通过为复杂的数据类型定义一个更加直观的名称,可以使代码更容易理解和维护。比如对于一个包含年、月、日的结构体,可以使用typedef将其命名为Date,而不是每次都使用struct关键字。typedef struct {
int year;
int month;
int day;
} Date;
其实针对汽车ECU软件,MISAR-C就如这样的要求规定,应该使用指示了大小和符号的typedef以代替基本数据类型。另外一个点-字节顺序,即大端模式(Big-Endian)和小端模式(Little-Endian),它们描述了多字节数据类型(例如整数和浮点数)在内存中存储时的字节排列顺序。在大端模式中,最高有效字节(Most Significant Byte, MSB)存储在最低内存地址,而最低有效字节(Least Significant Byte, LSB)存储在最高内存地址,如下所示:这种排列方式类似于我们阅读多位数字的习惯,即从左到右依次是高位到低位。在小端模式中,最低有效字节(LSB)存储在最低内存地址,而最高有效字节(MSB)存储在最高内存地址,,如下所示:这种排列方式与我们阅读多位数字的习惯相反,即从左到右依次是低位到高位。对于这两种模式的应用情况,在网络传输中,常使用大端模式可以快速判断报文信息,例如包长度和地址范围,因为高字节在先。而在进行数值运算时,小端模式更高效,因为加法和减法通常从低位开始,逐位进行,最后处理符号位。以上就是针对ECU 应用层软件模型生成代码,与硬件相关的配置,操作并不复杂,因此有余力可以搞清楚为什么要这样做,以及这样做了产生怎样的变化。关于typedef和大小端模式,经常能够看到它俩的存在,借此也稍作介绍和说明。
汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。