本文最后更新于 2026年6月17日。
AUTOSAR+Simulink C代码接口原理+模型规范配置(Classic CP,主流车用)
一、AUTOSAR-Simulink生成C代码的接口整体架构
1、分层接口逻辑(SWC算法 ↔ RTE ↔ BSW)
- Simulink模型层:Inport/Outport、Function-Call子系统、数据存储 → 映射AUTOSAR的Port、Runnable、DataElement
- 生成SWC应用C代码层(.c/.h):仅实现算法逻辑,不直接读写全局/硬件寄存器,所有输入输出必须调用RTE标准API,是应用与RTE的接口边界
- RTE层(由DaVinci/ISOLAR等工具根据ARXML生成):封装底层OS/COM/DIO等BSW,实现
Rte_Read/Rte_Write/Rte_Call标准化接口,隔离应用与底层软件
2、三类标准RTE接口(代码生成最终对外接口形式)
(1)S/R收发接口(Sender-Receiver,最常用,信号数据流)
模型:Inport=R-Port,Outport=P-Port → 生成RTE读写API
// 读输入(模型Inport)
Std_ReturnType Rte_Read_PortName_DataName(uint16 *data);
// 写输出(模型Outport)
Std_ReturnType Rte_Write_PortName_DataName(const uint16 data);
Simulink生成的Runnable函数内部自动插入上述RTE接口调用,禁止出现全局变量直接赋值
(2)C/S客户端-服务端接口(Client-Server,函数调用、服务交互)
模型:Function-Call In/Out、Function-Call子系统 → 生成服务调用接口
// Client调用服务
Std_ReturnType Rte_Call_PortName_OperateName(uint8 param, uint32 *ret);
多用于调用诊断、IO硬件服务、跨组件函数
(3)Mode管理接口(模式切换,少用):Rte_Switch/Rte_GetMode
3、Simulink生成的输出文件与接口对应关系
| 文件 | 接口作用 |
|---|---|
| xxxSWC.c | 所有Runnable算法实体:FUNC(void,SWC_CODE) Runnable_20ms(void){/*算法+RTE读写*/} |
| xxxSWC.h | Runnable函数声明、SWC对外头文件 |
| xxxSWC_types.h | AUTOSAR ADT应用数据类型typedef |
| xxx.arxml | SWC全量接口描述(端口、接口、Runnable,RTE生成的输入源文件) |
| Rte_xxx.h | RTE接口头文件(外部RTE工具生成,非Simulink输出) |
核心规则:Simulink只生成应用算法+ARXML,RTE接口源码由AUTOSAR集成工具根据ARXML生成
二、模型全流程规范设置(分步配置,满足AUTOSAR代码规范)
前置依赖安装
必须:Embedded Coder + AUTOSAR Blockset,目标tlc:autosar.tlc(非ert.tlc)
步骤1:模型基础参数配置(Ctrl+E)
- Code Generation→System target file:autosar.tlc(关键)
- Code→AUTOSAR Code Generation Options:
- 勾选
Use AUTOSAR compiler abstraction macros:启用FUNC()/VAR()/P2FUNC()标准AUTOSAR宏(规范必备) - 选择AUTOSAR版本:CP R4.2/R19-11(和整车架构ARXML版本一致)
- 勾选
- Code→Interface:
CodeInterfacePackaging=Reusable function,Runnable按子系统拆分成独立函数,禁止整模型一个大函数
步骤2:AUTOSAR字典(AUTOSAR Dictionary)+端口/接口映射(核心配置)
两种开发模式:自上而下(导入整车ARXML)/自下而上(模型自建接口导出ARXML)
① 自上而下(项目主流,架构已定)
- AUTOSAR标签→
Import from ARXML,导入DaVinci导出的整车SWC架构ARXML,自动生成带端口的空模型框架(Inport/Outport自动绑定Port名称、接口类型) - 打开Code Mapping编辑器(AUTOSAR→Code Mapping):
- 输入/输出端口 ↔ AUTOSAR R-Port/P-Port + S/R接口
- Function-Call子系统 ↔ AUTOSAR Runnable(配置周期:10ms/20ms,对应OS Task)
- Model Data Store ↔ AUTOSAR Peristent/IvData(静态变量,生成VAR()修饰)
② 自下而上(算法先行,后导出ARXML给集成)
- AUTOSAR Dictionary内手动新建:SWC→Port→S-R/CS Interface→DataElement(数据元素、数据类型ADT)
- Code Mapping把模型In/Out、子系统一一绑定字典内AUTOSAR元素
- 生成代码时同步导出xxx.arxml交付集成工具做RTE生成
步骤3:建模规范(模型设计硬性约束,否则代码不合规)
- IO只能用顶层Inport/Outport,禁止全局To Workspace/From Workspace、全局变量
所有外部输入输出全部走端口映射RTE,内部状态用AUTOSAR Data Store(不能用普通Unit Delay全局缓存),映射AUTOSAR Data,生成规范VAR()静态变量 - Runnable拆分:周期函数必须封装在独立Function-Call子系统
一个子系统=一个Runnable,配置触发周期,代码拆成独立FUNC(...,RunnableX),符合OS任务调度规范 - 数据类型规范:禁止直接用double/int
在AUTOSAR Dictionary定义ADT应用类型(带量程、单位)→绑定BDT基础类型(uint8/sint16/float32),模型信号全部绑定自定义ADT,生成types.h标准化typedef - C/S服务建模:调用底层驱动/诊断用Function-Call调用端口,映射CS接口,自动生成Rte_Call接口
步骤4:代码生成校验与导出
- AUTOSAR→Build Model:自动生成SWC C代码 + ARXML
- 校验要点:
- 算法代码无全局变量,IO全是
Rte_Read/Rte_Write调用 - 函数头带
FUNC(返回, 存储区)AUTOSAR标准宏 - ARXML包含完整Port、Interface、Runnable信息,可直接导入DaVinci生成RTE
- 算法代码无全局变量,IO全是
三、常见不规范问题&修正
- 生成代码出现rtb_xxx全局变量:Data没映射AUTOSAR DataStore,改用AUTOSAR数据存储+Code Mapping绑定
- 没有RTE接口、直接赋值:In/Out未映射AUTOSAR Port与S-R接口,重新在Code Mapping绑定端口
- 无FUNC宏、普通C函数:模型设置未勾选
Use AUTOSAR compiler abstraction macros - ARXML缺失接口信息:端口未关联Dictionary内Interface,缺少DataElement定义
AUTOSAR-CP Simulink建模+代码生成合规检查清单(直接落地对照,Classic AUTOSAR R4.2/R19-11通用)
适用:AUTOSAR Blockset+Embedded Coder,目标autosar.tlc,整车项目交付规范
一、模型顶层配置清单(Ctrl+E 配置页|必查11项)
| 序号 | 配置项 | 规范要求 | 不合规现象 |
|---|---|---|---|
| 1 | System target file | autosar.tlc,严禁ert.tlc/grt.tlc |
无RTE读写代码、无法导出ARXML |
| 2 | AUTOSAR Version | 和整车ARXML版本统一(R4.2.2 / R19-11) | ARXML导入DaVinci报错版本不兼容 |
| 3 | Use AUTOSAR compiler abstraction macros | ✅勾选(FUNC/VAR/P2CONST/DEF宏开关) | 生成原生int/void函数,无AUTOSAR标准修饰符 |
| 4 | Code→Interface→CodeInterfacePackaging | Reusable function |
整模型单一大函数,无法拆Runnable |
| 5 | Code→Data Types→Default storage class | Model default(AUTOSAR) |
自动生成rt全局变量 |
| 6 | Code Generation→Generate code only | ✅勾选(只生成SWC代码,不编译链接) | 额外生成main/rt_main测试入口 |
| 7 | 取消:Generate an example main program | ❌取消勾选 | 出现main函数,不符合SWC规范 |
| 8 | Hardware Implementation→Device | 匹配MCU(32/16位,位宽对齐BSW) | 基础类型BDT字节长度错乱 |
| 9 | AUTOSAR→ARXML Export路径 | 英文无空格、无中文路径 | 导出ARXML乱码、标签丢失 |
| 10 | Naming rule | 开启AUTOSAR命名规范(仅字母/数字/下划线,首字母不能数字) | ARXML名称非法,DaVinci导入失败 |
| 11 | 禁止:Inline parameters | ❌关闭参数内联 | 常量硬编码进代码,无法通过ARXML标定 |
二、AUTOSAR Dictionary 字典配置清单(架构核心|7项)
1.SWC配置
- SWC ShortName:项目命名规范(如
SWC_EngineCalc,无空格中文) - SWC Type:Application SWC,禁止NvM/BSW类型
2.接口与端口(S/R+CS分开)
- S/R接口(信号输入输出)
- 每个S-R Interface绑定DataElement
- DataElement绑定自定义ADT(应用类型)→ADT绑定BDT基础类型(U8/S16/F32)
- C/S接口(函数调用,驱动/诊断)
- ClientPort:模型Function-Call Outport
- ServerPort:模型Function-Call Inport
- Operation入参出参全部绑定ADT类型
- 所有Port必须挂载到SWC,悬空端口=不合格
3.数据类型规范
❌禁用原生double/int/single直接挂端口
✅所有In/Out信号→绑定AUTOSAR ADT(带Min/Max量程,标定用)
三、Code Mapping映射检查表(最容易出错|9项)
打开:AUTOSAR → Code Mapping
1.顶层Inport(输入)
- 映射:R-Port → S-R Interface → DataElement
- 生成代码:
Rte_Read_xxx()
2.顶层Outport(输出)
- 映射:P-Port → S-R Interface → DataElement
- 生成代码:
Rte_Write_xxx()
禁止In/Out不绑定AUTOSAR端口(直接全局赋值)
3.Runnable(周期任务)
- 周期算法必须封装独立Function-Call子系统,1个子系统=1个Runnable
- Runnable配置:ShortName+调度周期(1ms/10ms/20ms)+OS Task优先级(和整车OS匹配)
- 触发源:用
Function-Call Generator设置采样周期,禁止仿真Solver周期触发 - C/S调用子系统映射CS Operation,生成
Rte_Call_xxx()
4.内部状态变量(UnitDelay、状态缓存)
❌禁止普通Unit Delay直接生成全局rt变量
✅状态存储使用:AUTOSAR Data Store Memory
映射分类:
- IvData:上电初始化变量(运行时中间状态)
- PersistentData:掉电保存变量(对接NvM)
映射后代码:VAR(ADT_XXX, SWC_VAR)
5.模型参数(Gain/Constant标定值)
- 常量参数→AUTOSAR Parameter,映射CalibrationParameter
生成:CONST(ADT_XXX, SWC_CONST),可通过ARXML做标定
四、建模语法规范(模型绘图红线|10条禁令)
禁止项(出现任意一项代码不合规)
- ❌禁止顶层From Workspace/To Workspace
- ❌禁止全局Goto/From跨顶层传递信号(跨子系统优先端口)
- ❌禁止手动定义Simulink自定义StorageClass(只用AUTOSAR内置)
- ❌禁止直接用Constant模块填浮点数,全部走AUTOSAR Parameter
- ❌禁止混合采样速率无RateTransition(多周期Runnable之间加速率转换)
- ❌禁止MATLAB Function使用全局变量,入参出参走端口
- ❌禁止Model Reference子系统悬空IO,子系统IO也要映射AUTOSAR
- ❌禁止仿真用StopTime=inf以外特殊配置(不影响代码,但规范统一inf)
- ❌禁止中文注释、中文模块名、中文信号名
- ❌禁止手动手写C代码嵌入模型(S-Function优先改用CS接口建模)
推荐项
- 多周期算法按周期分包不同Function-Call子系统
- 复杂算法分层子系统,只留顶层IO做AUTOSAR端口
五、代码生成后产物校验(编译前核对|5项)
打开生成xxxSWC.c/h/xxx_types.h
- 函数规范
// 合规示例
FUNC(void, SWC_CODE) Runnable_20ms(void)
{
ADT_U16 InSig;
Rte_Read_RP_InputPort_Sig(&InSig);
// 算法
Rte_Write_PP_OutPort_Sig(OutData);
}
- 无裸
void Runnable_20ms() - IO全部Rte_Read/Rte_Write/Rte_Call,无直接全局赋值
-
变量规范
局部:AUTOSAR自动VAR/ CONST修饰,无uint16 rt_xxx;全局 -
types.h:所有类型来自ADT typedef,无原生基础类型定义
-
ARXML文件
用DaVinci/ISOLAR打开校验:SWC、Port、Interface、Runnable、DataType齐全,无缺失标签 -
无rt_全局数组/rtB/rtP系列自动生成变量(出现=映射缺失)
六、快速自检不合格速修表
| 异常代码现象 | 根因 | 修复方法 |
|---|---|---|
| 出现rtB_xxx全局变量 | Delay/状态未用AUTOSAR DataStore | 替换AUTOSAR DataStore+CodeMapping绑定IvData |
| 没有Rte_Read,直接变量赋值 | In/Out未绑定AUTOSAR Port | Code Mapping绑定R/P Port+S-R接口 |
| 函数无FUNC()宏 | 未勾选AUTOSAR抽象宏 | 配置页勾选Use AUTOSAR compiler abstraction macros |
| ARXML缺少Runnable | Function-Call子系统未映射Runnable | Code Mapping把子系统绑定Runnable并配置周期 |
| 参数硬编码数字 | 常量未映射AUTOSAR Parameter | Constant关联AUTOSAR标定参数 |
附件:最简空白合规模型搭建步骤(新建模型1分钟配置)
- 新建空白模型→Ctrl+E→目标autosar.tlc,勾选AUTOSAR宏
- AUTOSAR Dictionary新建SWC、S-R Interface、ADT数据类型
- 顶层放In/Outport,子系统包Function-Call+Function-Call Generator
- Code Mapping一一绑定端口→Port、子系统→Runnable
- Build生成代码+ARXML