车载MCU功能安全编程:E2E保护机制在传感器信号传输中的落地
传感器信号(轮速、踏板行程、转向角)进动力域MCU后,CAN/LIN底层CRC只保护“这段链路没错位”,不保证数据没被重放、插帧、寻址错。E2E做的是应用层端到端守护:发送端加Counter+CRC+Data ID,接收端四项全过才用数据。
一、Profile选型与字段布局
车载MCU最常用Profile 1:CRC-8 SAE J1850(多项式0x1D)、4bit计数器(0~14,0xF保留)、16bit Data ID。
典型布局(Variant 1A):
Byte0:CRC
Byte1低4位:Counter
Byte1高4位+后续:信号数据
CRC计算范围=Data ID + Counter + 数据域(不含CRC字节本身)。Data ID不显式发也行,靠隐式参与CRC防伪装。
二、发送端Protect
typedef struct {
uint16_t data_id;
uint8_t cnt; // 0..14
uint8_t tx[8];
} e2e_ctx_t;
void e2e_protect(e2e_ctx_t*c, uint8_t*data, uint8_t len){
c->cnt = (c->cnt>=14)?0:(c->cnt+1);
c->tx[0] = 0; // CRC先留空
c->tx[1] = (data[0] & 0xF0) | c->cnt;
memcpy(&c->tx[2], data, len);
uint8_t crc = Crc_CalculateCRC8(0x00,
(uint8_t*)&c->data_id, 2, 0x00); // DataID先入
crc = Crc_CalculateCRC8(crc, &c->tx[1], len+1, 0x00);
c->tx[0] = crc ^ 0x00;
}
Counter每发一次+1,不在中断里重置;Data ID大小端发送端接收端必须一致。
三、接收端Check
四道闸:CRC→Counter→Data ID匹配→超时。
typedef enum { E2E_OK, E2E_CRC_ERR,
E2E_SEQ_ERR, E2E_TIMEOUT } e2e_st_t;
e2e_st_t e2e_check(e2e_ctx_t*c, uint8_t*rx,
uint8_t len, uint32_t now){
uint8_t crc = Crc_CalculateCRC8(0x00,
(uint8_t*)&c->data_id,2,0x00);
crc = Crc_CalculateCRC8(crc,&rx[1],len,0x00);
if(crc != rx[0]) return E2E_CRC_ERR;
uint8_t cnt = rx[1] & 0x0F;
int diff = (cnt - c->last_cnt + 15) % 15; // 允许回绕
if(diff==0) return E2E_SEQ_ERR; // 重复帧
if(diff > MAX_DELTA) return E2E_SEQ_ERR; // 跳变过大
c->last_cnt = cnt;
if(now - c->last_rx > TIMEOUT_MS)
return E2E_TIMEOUT; // 周期×3~5
c->last_rx = now;
return E2E_OK;
}
MAX_DELTA一般取3,偶发丢一帧不报故障;连续错才进安全态。
四、故障处理:不更新即安全
E2E不是“校验错了打个日志”,动力域必须配合安全反应:
if(e2e_check(&ctx, frame, len, now)==E2E_OK){
wheel_speed = decode(frame);
use_value = 1;
}else{
use_value = 0; // 不刷新控制变量
Dem_SetEventStatus(WHEEL_E2E_FAIL, FAILED);
apply_safe_substitute(); // 上一有效值/默认0/降级扭矩
}
状态机分INIT/VALID/INVALID/SOME_LOST:首帧冷启动不立即报错,连续N帧有效才进VALID;连续错误超阈值才INVALID。
五、传感器场景落坑
轮速类高频信号:Counter跳变容忍别设1,总线抖动会误报;设3较稳
Data ID别复用:不同传感器信号必须唯一,否则网关转发会伪装
CRC参数对齐:多项式0x1D、初值0x00,和CAN硬件CRC不是一套,别混用
SPI外置传感器:E2E同样适用,MCU收SPI后按同逻辑校验,不只信片选
多接收方:P2C场景用Profile 3/6,各ECU可配不同Data ID
ASIL等级:动力域信号常ASIL C/D,E2E+WdgM+DEM联动,单靠CRC不够
别当加密用:E2E防随机故障和重放,不防主动攻击,密钥场景走SecOC
六、调度位置
Classic AUTOSAR里E2E Library在RTE/COM与PduR之间调用,保护I-PDU;裸机MCU就在接收任务里调e2e_check后再进控制算法。要点是“校验通过才写全局变量”,控制回路读的是已认证值。
按“Data ID绑定信号源+Counter防重放丢帧+CRC-8校验完整性+超时丢弃+错误走安全替代值”五件落地,传感器信号在MCU里就不会出现“CRC过了但数据是旧帧/插帧”的隐患。E2E本身不重,重的是状态机容错和故障反应链路——这也是ISO 26262通信条款真正卡的点。





