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 代码规范;