本文最后更新于 2026年7月22日。
一、先讲:什么是「普通静态算法」,对应气囊控制器场景
1. 静态内存(默认ERT代码,气囊工程标准配置)
Simulink代码生成默认:关闭动态内存分配 malloc/free
所有变量全部是全局静态 / 实例结构体静态内存:
- 积分器状态、延迟单元、滤波缓存、计数器、阈值参数、故障标志
- 输入输出结构体、DWork工作区、RTW参数表
全部在编译时就分配好固定内存,放在.data/.bss段,程序运行全程不申请、不释放堆内存。
这种全程不用 malloc 堆内存、内存固定不变的算法,行业叫静态算法。
2. 与之对比:动态算法(气囊基本不会开)
如果勾选「支持动态内存分配」,模型内部会调用 malloc 临时开辟缓存,用完 free;
气囊安全控制器绝对禁止开动态分配:
- 碰撞瞬间中断、多任务抢占会导致堆内存碎片、分配失败;
- ASIL-D功能安全要求:禁止运行时动态内存,避免内存泄漏、崩溃;
- 主机厂/ISO 26262规范强制关闭malloc。
二、气囊控制器算法:initialize / step / terminate 分别怎么用
气囊是典型安全关键、静态内存、周期离散控制模型
1. xxx_initialize() —— 必须调用,整机上电只执行1次
调用时机:
ECU上电完成硬件初始化(电源、CAN、AD采样、加速度传感器、点火回路诊断)之后,主初始化任务只调用一次。
气囊模型初始化会做这些安全相关动作:
- 所有加速度滤波、二阶滞后、积分状态清零;
- 碰撞判定计时器、防误爆延时、锁存标志复位;
- 各级阈值、标定参数加载进内部工作区;
- 故障状态、抑制标志、起爆锁存位恢复默认安全状态(抑制起爆)。
关键禁忌
绝对不能把 initialize 放到周期中断里循环调用!
如果每周期Init,碰撞积分、计时会不停清零,直接丢失碰撞波形,该起爆不起爆,严重功能安全失效。
特殊场景:ECU软复位/唤醒重启
如果休眠唤醒、软件复位不重新上电,需要再次调用一次 initialize,重置所有碰撞检测状态。
2. xxx_step() —— 核心,周期中断固定频率循环调用
气囊常规采样周期:1ms / 2ms 定周期Os任务(AUTOSAR Os 周期任务)
每一步执行流程:
- 把当前X/Y/Z轴加速度、车速、安全带信号、点火回路诊断状态赋值给模型输入;
- step内部运行:滤波、波形特征提取、碰撞分级判断、起爆时序逻辑、误爆抑制、故障降级逻辑;
- 运算完成后读取模型输出:是否起爆、哪一路点火、故障报警、抑制标志;
- 输出给到底层驱动,控制点火管驱动与故障上报。
硬性要求:调用周期必须严格匹配模型离散采样时间,抖动不能过大,否则碰撞积分、波形识别失真。
3. xxx_terminate() —— 气囊控制器完全可以不用调用,无任何安全风险
原因就是你是纯静态内存算法:
- 没有
malloc堆内存,不存在内存泄漏; - 气囊ECU只有两种结束场景:
- 正常下电:MCU直接掉电,内存直接消失,terminate执行与否无意义;
- 碰撞起爆后锁存:算法持续运行直到断电,不会主动停止算法;
- terminate内部默认逻辑:只释放动态堆内存、关闭虚拟IO,静态模型里这个函数是空逻辑,内部几乎无代码。
什么时候气囊工程会主动调用terminate(极少)
只有你在模型里手动添加自定义终止逻辑,比如:
- 停机前把最终碰撞特征数据写入Flash非易失存储;
- 停机前记录故障快照;
这种定制收尾逻辑才需要在关机ShutdownTask里调用一次;
原厂标准气囊算法不添加自定义收尾时,直接不调用terminate完全合规、不影响功能安全。
三、气囊控制器标准调用流程(AUTOSAR ASIL-D规范)
- ECU上电 → 底层硬件初始化(电源、传感器、点火诊断)
- InitTask 执行一次
Airbag_initialize() - Os 1ms周期任务循环:
- 采集加速度、整车状态信号
Airbag_step()- 解析输出,驱动点火与故障诊断
- 整车熄火下电:
- 停止周期任务
- 可选:如有Flash存储逻辑则调用
Airbag_terminate() - 硬件断电
四、气囊行业易错点总结
- Init只上电一次,禁止周期重复调用;
- Step严格定周期运行,是碰撞检测核心;
- Terminate无动态内存时可省略,不影响起爆逻辑与功能安全;
- 气囊属于纯静态算法,工程配置强制关闭动态内存分配。