VCU应用开发学习
RTE层理解
RTE 是 AUTOSAR 里把应用层和基础软件连接起来的“中间适配层
下面是一段rte.c里面的代码
可以看见所有的变量我们在做simulink程序时都会加载进去
GeneralInputSignal():信号接收函数,从总线读取外部输入信号,存入全局变量gs_xx(global signal input)
循环调用统一接口Com_ReceiveSignal(信号ID, 存储地址)
入参 1:宏定义COM_RXSIGXX,对应 CAN 数据库里的接收信号唯一标识
入参 2:全局输入变量指针,总线数据读取后直接写入该内存
GeneralOutputSignal():信号发送函数,先更新 RTE 层输出缓存,再将内部控制变量gout_xx(global output)打包发送至 CAN 总
执行顺序(AutoSar 标准流程)
Rte_UpdateOutputSignals();RTE(Run-Time Environment)层输出缓存刷新,把应用层算法计算结果同步到 COM 通信层缓存,是 AutoSar 分层架构强制步骤。
批量调用Com_SendSignal(信号ID, 待发送变量地址),将内部控制量打包发送到 CAN 总线给下游控制器(转向电机、驱动电机、制动系统 SEB 等)
COM层理解
该文件禁止手动修改,变更 CAN 信号、报文长度后,需重新从 CAN 数据库生成
这是COM 模块配置头文件,由 CAN 数据库 / 配置工具自动生成,定义了 CAN 接收信号的句柄 ID、报文缓存长度、信号总数量,是Com_ReceiveSignal接口的底层宏定义来源,和GeneralInputSignal函数一一对应
/*the buffer size of Message received */ #define COM_RXIPDUY1_X2_BUFFER_SIZE 8u #define COM_RXIPDUE_F_G_H_BUFFER_SIZE 8u #define COM_RXIPDUA_B_C_D_BUFFER_SIZE 8u #define COM_RXIPDUCAN2_CONTROL_RX_BUFFER_SIZE 8u #define COM_RXIPDUCAN3_CONTROL_RX_BUFFER_SIZE 8u- 含义:
IPDU= CAN 报文(PDU),所有接收报文数据缓存长度均为8 字节,符合标准 CAN 2.0 报文最大 8 字节负载规范。 - 分组逻辑:
Y1_X2:存放 X2、Y1 信号的接收报文E_F_G_H:存放 E/F/G/H 四路信号报文A_B_C_D:存放 A/B/C/D 四路信号报文
/* number of Rx object Signal */ #define COM_RXSIGNUM 12u接收信号句柄 ID(核心映射,对接上一段代码)
/* Handles of receive signals */ #define COM_RXSIGX2 0u #define COM_RXSIGY1 1u #define COM_RXSIGE 2u #define COM_RXSIGG 3u #define COM_RXSIGH 4u #define COM_RXSIGF 5u #define COM_RXSIGA 6u #define COM_RXSIGB 7u #define COM_RXSIGC 8u #define COM_RXSIGD 9u #define COM_RXSIGCAN2_SIGNAL_RX 10u #define COM_RXSIGCAN3_SIGNAL_RX 11u之前GeneralInputSignal里调用的Com_ReceiveSignal(COM_RXSIGX2, &gs_X2),本质就是给 COM 模块传入信号 ID=0,指定读取 X2 信号到 gs_X2 内存。通讯站配置
- 配置工具生成
Com_Cfg.h,给每个 CAN 接收信号分配唯一数字 ID; - 业务层
GeneralInputSignal使用宏名调用Com_ReceiveSignal; - COM 底层根据传入 ID,找到对应 IPDU 缓存,解析报文数据写入传入的全局变量
gs_xx; COM_RXSIGNUM=12u约束总接收信号数量,做循环遍历、数组映射时可直接用该宏自动适配数- 所有
#define xxx 8u末尾带u代表无符号 8 位整数,符合 AutoSar 代码规范;