atuosar对simulink模型生成c代码的接口是怎样的,怎么设置模型能符合规范

210 次阅读

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

AUTOSAR+Simulink C代码接口原理+模型规范配置(Classic CP,主流车用)

一、AUTOSAR-Simulink生成C代码的接口整体架构

1、分层接口逻辑(SWC算法 ↔ RTE ↔ BSW)

  1. Simulink模型层:Inport/Outport、Function-Call子系统、数据存储 → 映射AUTOSAR的Port、Runnable、DataElement
  2. 生成SWC应用C代码层(.c/.h):仅实现算法逻辑,不直接读写全局/硬件寄存器,所有输入输出必须调用RTE标准API,是应用与RTE的接口边界
  3. 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)

  1. Code Generation→System target file:autosar.tlc(关键)
  2. Code→AUTOSAR Code Generation Options:
    • 勾选Use AUTOSAR compiler abstraction macros:启用FUNC()/VAR()/P2FUNC()标准AUTOSAR宏(规范必备)
    • 选择AUTOSAR版本:CP R4.2/R19-11(和整车架构ARXML版本一致)
  3. Code→Interface:CodeInterfacePackaging=Reusable function,Runnable按子系统拆分成独立函数,禁止整模型一个大函数

步骤2:AUTOSAR字典(AUTOSAR Dictionary)+端口/接口映射(核心配置)

两种开发模式:自上而下(导入整车ARXML)/自下而上(模型自建接口导出ARXML)

① 自上而下(项目主流,架构已定)

  1. AUTOSAR标签→Import from ARXML,导入DaVinci导出的整车SWC架构ARXML,自动生成带端口的空模型框架(Inport/Outport自动绑定Port名称、接口类型)
  2. 打开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给集成)

  1. AUTOSAR Dictionary内手动新建:SWC→Port→S-R/CS Interface→DataElement(数据元素、数据类型ADT)
  2. Code Mapping把模型In/Out、子系统一一绑定字典内AUTOSAR元素
  3. 生成代码时同步导出xxx.arxml交付集成工具做RTE生成

步骤3:建模规范(模型设计硬性约束,否则代码不合规)

  1. IO只能用顶层Inport/Outport,禁止全局To Workspace/From Workspace、全局变量
    所有外部输入输出全部走端口映射RTE,内部状态用AUTOSAR Data Store(不能用普通Unit Delay全局缓存),映射AUTOSAR Data,生成规范VAR()静态变量
  2. Runnable拆分:周期函数必须封装在独立Function-Call子系统
    一个子系统=一个Runnable,配置触发周期,代码拆成独立FUNC(...,RunnableX),符合OS任务调度规范
  3. 数据类型规范:禁止直接用double/int
    在AUTOSAR Dictionary定义ADT应用类型(带量程、单位)→绑定BDT基础类型(uint8/sint16/float32),模型信号全部绑定自定义ADT,生成types.h标准化typedef
  4. C/S服务建模:调用底层驱动/诊断用Function-Call调用端口,映射CS接口,自动生成Rte_Call接口

步骤4:代码生成校验与导出

  1. AUTOSAR→Build Model:自动生成SWC C代码 + ARXML
  2. 校验要点:
    • 算法代码无全局变量,IO全是Rte_Read/Rte_Write调用
    • 函数头带FUNC(返回, 存储区)AUTOSAR标准宏
    • ARXML包含完整Port、Interface、Runnable信息,可直接导入DaVinci生成RTE

三、常见不规范问题&修正

  1. 生成代码出现rtb_xxx全局变量:Data没映射AUTOSAR DataStore,改用AUTOSAR数据存储+Code Mapping绑定
  2. 没有RTE接口、直接赋值:In/Out未映射AUTOSAR Port与S-R接口,重新在Code Mapping绑定端口
  3. 无FUNC宏、普通C函数:模型设置未勾选Use AUTOSAR compiler abstraction macros
  4. 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配置

  1. SWC ShortName:项目命名规范(如SWC_EngineCalc,无空格中文)
  2. SWC Type:Application SWC,禁止NvM/BSW类型

2.接口与端口(S/R+CS分开)

  1. S/R接口(信号输入输出)
  • 每个S-R Interface绑定DataElement
  • DataElement绑定自定义ADT(应用类型)→ADT绑定BDT基础类型(U8/S16/F32)
  1. C/S接口(函数调用,驱动/诊断)
  • ClientPort:模型Function-Call Outport
  • ServerPort:模型Function-Call Inport
  • Operation入参出参全部绑定ADT类型
  1. 所有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(周期任务)

  1. 周期算法必须封装独立Function-Call子系统,1个子系统=1个Runnable
  2. Runnable配置:ShortName+调度周期(1ms/10ms/20ms)+OS Task优先级(和整车OS匹配)
  3. 触发源:用Function-Call Generator设置采样周期,禁止仿真Solver周期触发
  4. C/S调用子系统映射CS Operation,生成Rte_Call_xxx()

4.内部状态变量(UnitDelay、状态缓存)

❌禁止普通Unit Delay直接生成全局rt变量
✅状态存储使用:AUTOSAR Data Store Memory
映射分类:

  1. IvData:上电初始化变量(运行时中间状态)
  2. PersistentData:掉电保存变量(对接NvM)
    映射后代码:VAR(ADT_XXX, SWC_VAR)

5.模型参数(Gain/Constant标定值)

  • 常量参数→AUTOSAR Parameter,映射CalibrationParameter
    生成:CONST(ADT_XXX, SWC_CONST),可通过ARXML做标定

四、建模语法规范(模型绘图红线|10条禁令)

禁止项(出现任意一项代码不合规)

  1. ❌禁止顶层From Workspace/To Workspace
  2. ❌禁止全局Goto/From跨顶层传递信号(跨子系统优先端口)
  3. ❌禁止手动定义Simulink自定义StorageClass(只用AUTOSAR内置)
  4. ❌禁止直接用Constant模块填浮点数,全部走AUTOSAR Parameter
  5. ❌禁止混合采样速率无RateTransition(多周期Runnable之间加速率转换)
  6. ❌禁止MATLAB Function使用全局变量,入参出参走端口
  7. ❌禁止Model Reference子系统悬空IO,子系统IO也要映射AUTOSAR
  8. ❌禁止仿真用StopTime=inf以外特殊配置(不影响代码,但规范统一inf)
  9. ❌禁止中文注释、中文模块名、中文信号名
  10. ❌禁止手动手写C代码嵌入模型(S-Function优先改用CS接口建模)

推荐项

  1. 多周期算法按周期分包不同Function-Call子系统
  2. 复杂算法分层子系统,只留顶层IO做AUTOSAR端口

五、代码生成后产物校验(编译前核对|5项)

打开生成xxxSWC.c/h/xxx_types.h

  1. 函数规范
// 合规示例
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,无直接全局赋值
  1. 变量规范
    局部:AUTOSAR自动VAR/ CONST修饰,无uint16 rt_xxx;全局

  2. types.h:所有类型来自ADT typedef,无原生基础类型定义

  3. ARXML文件
    用DaVinci/ISOLAR打开校验:SWC、Port、Interface、Runnable、DataType齐全,无缺失标签

  4. 无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分钟配置)

  1. 新建空白模型→Ctrl+E→目标autosar.tlc,勾选AUTOSAR宏
  2. AUTOSAR Dictionary新建SWC、S-R Interface、ADT数据类型
  3. 顶层放In/Outport,子系统包Function-Call+Function-Call Generator
  4. Code Mapping一一绑定端口→Port、子系统→Runnable
  5. Build生成代码+ARXML