本文最后更新于 2026年6月16日。
快速判断现有手写C代码是否为AUTOSAR架构(气囊SRS ECU专用,5步肉眼筛查,10分钟搞定)
核心判断逻辑:只要代码大量出现RTE接口、AUTOSAR标准宏、分层架构=AUTOSAR;直接操作寄存器、裸全局、直调驱动=非AUTOSAR
一、第一步:看头文件(最快,打开main.c/各个模块.h)
是AUTOSAR特征
- 代码里包含:
#include "Rte.h"、Rte_xxx.h、Compiler.h、Std_Types.h、Platform_Types.h
Std_Types.h、Compiler.h是AUTOSAR标配基础头文件,没有基本就不是
- 分目录:
- BSW/(Os、Com、Dio、Adc、Can、NvM、Det)底层驱动目录
- RTE/(Rte生成代码目录)
- SWC/(应用算法,气囊起爆逻辑放这里)
非AUTOSAR特征
只有app.c、driver.c、io.c,无RTE、BSW分层,直接#include "adc_reg.h"寄存器头文件。
二、第二步:检索代码关键字(全局搜索,Ctrl+F)
【出现下面任意一类 → AUTOSAR架构】
1. RTE接口函数(最关键标识)
Rte_Read_
Rte_Write_
Rte_Call_
Rte_Get_
Rte_Switch_
气囊举例:
Rte_Read_RP_AccData_AccX(&u16AccX); 读取加速度;
Rte_Call_CP_IgniterDrv_Fire(); 点火驱动调用。
只要算法逻辑里用Rte_读写信号,100%AUTOSAR
2. AUTOSAR编译器抽象宏(FUNC/VAR/CONST/P2CONST)
FUNC(void, SWC_SRS_CODE) Runnable_10ms(void) //函数修饰
VAR(sint16, SWC_VAR) AccFilter; //局部变量
CONST(uint16, SWC_CONST) CRASH_THRESHOLD=350;//标定常量
手写裸C不会统一加这套宏。
3. 标准AUTOSAR基础类型
不用 int、short、float,统一用:
uint8、sint8、uint16、sint16、float32(来自Std_Types.h)
【出现下面代码 → 非AUTOSAR裸架构】
- 直接读写寄存器:
ADC->DR = xxx; CAN->TXBUF=xxx; - 算法里直接调用底层驱动:
ADC_GetValue()、Fire_Igniter1(),无Rte_Call封装 - 大量全局变量:
uint16 gs_AccX;跨文件extern全局传参
三、第三步:看任务调度(气囊1ms/10ms周期任务)
AUTOSAR
- 没有裸while(1)大循环;
- 由OS调度Runnable:
Runnable_1ms()、Runnable_10ms(),在Os配置里绑定Task; - 入口是OS启动:
StartOS()。
非AUTOSAR
主函数死循环:
while(1)
{
AdcSample();
SrsCalc();
DiagCheck();
}
定时器中断里直接调用算法函数。
四、第四步:参数与掉电存储NVM判断
- AUTOSAR:标定参数、故障存储全部调用NvM接口:
NvM_ReadBlock/NvM_WriteBlock,不会直接读写Flash地址; - 裸C:直接操作Flash地址:
Flash_Write(0x10000, buf);。
五、第五步:工程是否有ARXML文件
工程目录存在.arxml文件(整车配置、SWC描述)= AUTOSAR;
只有.c/.h/.cfg/.prj无arxml=非AUTOSAR。
极简总结(气囊快速判定口诀)
- 有Rte_Read/Rte_Write → AUTOSAR
- 直接读ADC寄存器、直点点火驱动 → 非AUTOSAR
- FUNC/VAR宏成堆 → AUTOSAR
- while(1)裸循环跑算法 → 非AUTOSAR
延伸:旧手写裸C改成Simulink AUTOSAR流程(气囊项目常用)
- 原有算法拆分成:输入信号、算法逻辑、输出点火/状态;
- Inport=Rte_Read,Outport=Rte_Write,点火驱动封装CS接口Rte_Call;
- 按周期拆Function-Call子系统对应Runnable;
- Simulink生成SWC代码+ARXML,对接原有BSW生成的RTE。