当前控制器程序使用c手写的,我怎么判断它是否是基于autosar的

57 次阅读

本文最后更新于 2026年6月16日。

快速判断现有手写C代码是否为AUTOSAR架构(气囊SRS ECU专用,5步肉眼筛查,10分钟搞定)

核心判断逻辑:只要代码大量出现RTE接口、AUTOSAR标准宏、分层架构=AUTOSAR;直接操作寄存器、裸全局、直调驱动=非AUTOSAR

一、第一步:看头文件(最快,打开main.c/各个模块.h)

是AUTOSAR特征

  1. 代码里包含:#include "Rte.h"Rte_xxx.hCompiler.hStd_Types.hPlatform_Types.h

Std_Types.h、Compiler.h是AUTOSAR标配基础头文件,没有基本就不是

  1. 分目录:
- 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裸架构】

  1. 直接读写寄存器:ADC->DR = xxx; CAN->TXBUF=xxx;
  2. 算法里直接调用底层驱动:ADC_GetValue()、Fire_Igniter1(),无Rte_Call封装
  3. 大量全局变量:uint16 gs_AccX; 跨文件extern全局传参

三、第三步:看任务调度(气囊1ms/10ms周期任务)

AUTOSAR

  1. 没有裸while(1)大循环;
  2. 由OS调度Runnable:Runnable_1ms()、Runnable_10ms(),在Os配置里绑定Task;
  3. 入口是OS启动:StartOS()

非AUTOSAR

主函数死循环:

while(1)
{
    AdcSample();
    SrsCalc();
    DiagCheck();
}

定时器中断里直接调用算法函数。

四、第四步:参数与掉电存储NVM判断

  1. AUTOSAR:标定参数、故障存储全部调用NvM接口:NvM_ReadBlock/NvM_WriteBlock,不会直接读写Flash地址;
  2. 裸C:直接操作Flash地址:Flash_Write(0x10000, buf);

五、第五步:工程是否有ARXML文件

工程目录存在.arxml文件(整车配置、SWC描述)= AUTOSAR;
只有.c/.h/.cfg/.prj无arxml=非AUTOSAR。

极简总结(气囊快速判定口诀)

  1. 有Rte_Read/Rte_Write → AUTOSAR
  2. 直接读ADC寄存器、直点点火驱动 → 非AUTOSAR
  3. FUNC/VAR宏成堆 → AUTOSAR
  4. while(1)裸循环跑算法 → 非AUTOSAR

延伸:旧手写裸C改成Simulink AUTOSAR流程(气囊项目常用)

  1. 原有算法拆分成:输入信号、算法逻辑、输出点火/状态;
  2. Inport=Rte_Read,Outport=Rte_Write,点火驱动封装CS接口Rte_Call;
  3. 按周期拆Function-Call子系统对应Runnable;
  4. Simulink生成SWC代码+ARXML,对接原有BSW生成的RTE。