本文最后更新于 2026年6月17日。
一、AUTOSAR通俗+车用本质(安全气囊SRS必须遵守,属于ASIL-B/D功能安全)
1.AUTOSAR是什么
AUTOSAR = 汽车开放系统架构(汽车嵌入式软件行业统一标准规范)
整车厂+零部件厂(博世、大陆、奥托立夫等气囊供应商)联合制定,把车用软件拆成两层:应用层 + 底层BSW层,彻底解耦。
- 底层BSW(基础软件):驱动MCU、ADC、CAN、定时器、看门狗、OS、通信、NVM存储,由芯片/BSW工具(DaVinci、ISOLAR)实现;
- 上层APP(算法):气囊起爆逻辑、加速度判断、阈值算法、故障诊断,就是你Simulink做的模型;
- 中间RTE(运行时环境):AUTOSAR核心隔离层,应用算法不能直接碰寄存器、不能直接收发CAN、不能读写硬件,所有输入输出统一调用
Rte_Read/Rte_Write/Rte_Call标准API。
一句话:AUTOSAR是整车软件的“统一插座标准”,不同供应商算法能无缝对接整车底盘/车身网络。
2.安全气囊控制器SRS:必须严格遵守AUTOSAR + ISO26262功能安全
气囊属于安全相关ECU,ASIL-B~ASIL-D等级(功能安全最高档),车企量产强制要求AUTOSAR规范生成代码:
- 不按AUTOSAR:算法裸写全局变量、直接读写CAN/IO,BSW团队无法集成、无法做功能安全追溯、无法过整车标定与量产审核;
- 气囊特殊性:
- 起爆逻辑不能出现野指针、全局变量乱飞(误起爆=重大安全事故);
- AUTOSAR标准化接口+规范代码,是ISO26262代码合规硬性条件;
- 所有输入(G值加速度、碰撞信号、点火回路诊断)走RTE_S/R接口;点火驱动调用底层驱动用C/S Client-Server接口(Rte_Call)。
结论:气囊ECU → 强制AUTOSAR建模+代码生成,没有例外。
二、SWC是什么(AUTOSAR最小软件单元,你Simulink模型 = 1个SWC)
SWC:Software Component,软件组件,AUTOSAR软件最小打包单元
1.通俗理解
一个ECU内部按功能拆成多个SWC:
以安全气囊ECU举例:
- SWC_SRS_Calc:碰撞算法(你Simulink做的:加速度滤波、碰撞阈值判断、起爆时序逻辑)→ 你的模型就是这个SWC
- SWC_SRS_Diag:故障诊断(点火回路断路/短路检测)
- SWC_SRS_NVM:故障码、标定参数掉电存储
2.SWC三大核心规则(直接关联Simulink建模)
- SWC对外只有端口(Port),没有全局变量对外暴露
- R-Port(接收端口):Inport → Rte_Read(加速度信号、点火状态输入)
- P-Port(发送端口):Outport → Rte_Write(故障码、状态输出给CAN)
- C/S Client端口:调用底层点火驱动
Rte_Call
- SWC内部功能拆分为若干Runnable(周期任务函数)
气囊常用:- Runnable_1ms:高速采集加速度ADC数据
- Runnable_10ms:滤波+碰撞判定
- Runnable_50ms:故障诊断
→ 一个Function-Call子系统 = 一个Runnable,生成独立C函数
- SWC通过ARXML文件描述自身接口,BSW工程师用ARXML生成RTE源码,实现算法和底层对接。
3.你的Simulink ↔ AUTOSAR映射对应表
| Simulink内容 | AUTOSAR概念 |
|---|---|
| 整个模型 | 1个Application-SWC(应用组件) |
| 顶层Inport | R-Port(接收端口) |
| 顶层Outport | P-Port(发送端口) |
| Function-Call子系统 | Runnable(周期任务) |
| AUTOSAR DataStore | IvData/PersistentData(组件内部状态) |
| Constant标定参数 | CalibrationParameter(标定参数) |
三、气囊ECU最简AUTOSAR接口示例(生成出来的真实C代码)
FUNC(void,SWC_SRS_CODE) Runnable_10ms(void)
{
VAR(ADT_ACC_RAW,SWC_VAR) AccX;
VAR(ADT_FIRE_CMD,SWC_VAR) FireCmd = FIRE_DISABLE;
// 1.通过RTE读加速度传感器输入(不能直接读ADC寄存器)
Rte_Read_RP_AccSensor_Data(&AccX);
// 2.气囊算法:碰撞判断
FireCmd = SRS_CollisionJudge(AccX);
// 3.满足条件调用底层驱动点火(C/S接口调用硬件)
if(FireCmd == FIRE_ENABLE)
{
Rte_Call_CP_FireDriver_FireIgniter();
}
// 4.输出起爆状态
Rte_Write_PP_SrsState_Data(FireCmd);
}
- 全程没有全局变量、没有直接操作硬件寄存器,完全符合AUTOSAR+气囊功能安全规范。
四、补充:非AUTOSAR弊端(气囊绝对不能这么做)
如果不用AUTOSAR,模型生成裸C:
// 违规写法,气囊项目禁用
uint16 AccX;
void SRS_Calc(void)
{
AccX = ADC_Read(0); // 直接读硬件
if(AccX>500) FIRE();// 直接调用驱动函数
}
问题:
- BSW换MCU/换驱动,算法代码全部要改;
- 功能安全无法追溯,不能过ASIL安全审核;
- 整车CAN通信改信号名,算法源码需要手动修改。