当前位置: 首页 > ai >正文

使用Simulink开发Autosar Nvm存储逻辑

文章目录

    • 前言
    • Autosar Nvm接口
    • 设计模型及接口
    • 生成代码及arxml
    • RTE接口mapping
    • RTE代码分析
    • 总结

前言

之前介绍过Simulink开发Dem故障触发逻辑,本文接着介绍另外一个常用的功能-Nvm存储的实现。

Autosar Nvm接口

Autosar Nvm中一般在上电初始化的时调用Nvm_ReadAll获取Nvm block的数据到Ram中。对于block来说,可以通过Nvm_ReadBlock进行读取,通过Nvm_WriteBlock进行写入。Autosar Dem标准接口为NvMService,使用Simulink中自带的demo-autosar_bsw_sensor中的定义,如下所示:在这里插入图片描述
需要注意的是:生成的package位置为/AUTOSAR/Services/Dem(暂时没找到怎么修改),而在使用时,导入对应Autosar工具(例如Etas)时可能会找不到对应的定义。此处我们后面是手动更改arxml中的package路径

设计模型及接口

配置Nvm的ClientPort,如下所示
在这里插入图片描述
Nvm需要使用到Simulink自带的Data Store Memory模块,如下所示
在这里插入图片描述
在初始化函数中进行Nvm读取
在这里插入图片描述
配置Nvm的Port及读取的函数
在这里插入图片描述

做了一个简单的存储逻辑:当输入值小于存储的值时,触发Nvm的存储
在这里插入图片描述
写入需要使用Data Store Write,然后使用Data Store Read调用WriteBlock进行写入,如下所示
在这里插入图片描述
配置Nvm的Port及写入的函数
在这里插入图片描述

Nvm的Functions Callers在刷新后会自动生成并mapping
在这里插入图片描述

生成代码及arxml

生成的代码中调用了RTE函数Rte_Call_S1LowSetPoint_ReadBlock用来读取Nvm,调用RTE函数Rte_Call_S1LowSetPoint_WriteBlock用来写入Nvm,示例如下:


/* Model step function */
void Runnable_Step(void)
{uint16 rtb_RelationalOperator_tmp;boolean rtb_RelationalOperator;/* Outport: '<Root>/Percent' incorporates:*  DataTypeConversion: '<Root>/Data Type Conversion'*  Inport: '<Root>/RawADC'*  Lookup_n-D: '<Root>/TPS Lookup'*/Rte_IWrite_Runnable_Step_Percent_Percent(rtCP_TPSLookup_tableData[plook_u32f_linckan(Rte_IRead_Runnable_Step_RawADC_RawADC(), rtCP_TPSLookup_bp01Data, 10U)]);/* Outputs for Triggered SubSystem: '<Root>/Enabled Subsystem' incorporates:*  TriggerPort: '<S1>/Trigger'*//* RelationalOperator: '<Root>/Relational Operator' incorporates:*  DataStoreWrite: '<S1>/Data Store Write'*  Inport: '<Root>/RawADC'*/rtb_RelationalOperator_tmp = Rte_IRead_Runnable_Step_RawADC_RawADC();/* End of Outputs for SubSystem: '<Root>/Enabled Subsystem' *//* RelationalOperator: '<Root>/Relational Operator' incorporates:*  DataStoreRead: '<Root>/Data Store Read'*  Inport: '<Root>/RawADC'*/rtb_RelationalOperator = (rtb_RelationalOperator_tmp < rtARID_DEF.LowSetPoint);/* Outputs for Triggered SubSystem: '<Root>/Enabled Subsystem' incorporates:*  TriggerPort: '<S1>/Trigger'*/if (rtb_RelationalOperator && (rtARID_DEF.EnabledSubsystem_Trig_ZCE !=POS_ZCSIG)) {/* DataStoreWrite: '<S1>/Data Store Write' */rtARID_DEF.LowSetPoint = rtb_RelationalOperator_tmp;/* FunctionCaller: '<S1>/NvMServiceCaller1' */Rte_Call_S1LowSetPoint_WriteBlock(&rtARID_DEF.LowSetPoint);}rtARID_DEF.EnabledSubsystem_Trig_ZCE = rtb_RelationalOperator;/* End of Outputs for SubSystem: '<Root>/Enabled Subsystem' */
}/* Model initialize function */
void Runnable_Init(void)
{/* Start for DataStoreMemory: '<Root>/Data Store Memory' */rtARID_DEF.LowSetPoint = 50U;/* SystemInitialize for Triggered SubSystem: '<Root>/Enabled Subsystem' */rtARID_DEF.EnabledSubsystem_Trig_ZCE = ZERO_ZCSIG;/* End of SystemInitialize for SubSystem: '<Root>/Enabled Subsystem' *//* Outputs for Atomic SubSystem: '<Root>/Initialize_Function' *//* FunctionCaller: '<S2>/NvMServiceCaller' */Rte_Call_S1LowSetPoint_ReadBlock(&rtARID_DEF.LowSetPoint);/* End of Outputs for SubSystem: '<Root>/Initialize_Function' */
}

对应的arxml中也生成了对应的接口描述
在这里插入图片描述
此处对应的package路径不对,需要替换成ETAS Nvm对应路径(/AUTOSAR_NvM/PortInterfaces/),替换完后copy到ETAS工具链中

在这里插入图片描述

RTE接口mapping

如果是新增的SWC,还需要将SWC映射到对应的EcucPartition上,且对应的runnable也要映射到对应的task上,本文不介绍这部分内容,默认上述工作已经完成

注意:初始化的Runnable在SWC中没有对应的Event,原因是Simulink中未配置,需要配置如下:
在这里插入图片描述

此处默认对应的NVM block已经建立好了(Nvm block需要配置NvMRbGenRteServicePort为True)。在对应的Nvm ServiceSwComponent中已经有了对应的Pport
Simulink生成的Arxml中的SWC中已经有了对应的NVM接口(Rport,Client接口)
在这里插入图片描述
Runnable中也有了对应调用关系

在这里插入图片描述
在这里插入图片描述
注意:此处生成的Server Call Point是Async接口,会导致后面ETAS生成RTE时生成Alarm和其他无关的代码,我们不需要,此处需要手动修改为Sync接口,如下所示:
在这里插入图片描述
在这里插入图片描述

将SWC接口与NVM接口进行mapping
在这里插入图片描述
mapping好后进行ECU Extract,然后生成RTE代码即可

RTE代码分析

在生成的SWC RTE头文件中,有对应的接口调用宏定义

#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Init)
/* Inline function call optimization; Rte_Call_S1LowSetPoint_ReadBlock to NvM_ReadBlock */
#define Rte_Call_S1LowSetPoint_ReadBlock( DstPtr ) NvM_ReadBlock(((VAR(NvM_BlockIdType, AUTOMATIC))43), DstPtr)#endif
#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Step)
/* Inline function call optimization; Rte_Call_S1LowSetPoint_WriteBlock to NvM_WriteBlock */
#define Rte_Call_S1LowSetPoint_WriteBlock( SrcPtr ) NvM_WriteBlock(((VAR(NvM_BlockIdType, AUTOMATIC))43), SrcPtr)#endif

自动生成的宏中实际也是调用的对应Nvm的函数,只是加上了对应的Nvm id,这样的话,应用层也不需要关心是具体是哪个Nvm id了

总结

使用Simulink Nvm模块可以减少一部分Nvm相关的RTE接口,能够节省一部分存储交互的工作量。

http://www.xdnf.cn/news/5237.html

相关文章:

  • Qt开发经验 --- 避坑指南(11)
  • Ctrl + D是如何与内核文件结束符对应的?如何模拟文件结束符?数字中间为什么不能插入空格或逗号?丰富多彩的语句结束符或分隔符?语句结束符?
  • (剪映)视频添加字幕
  • SEO长尾关键词优化实战技法
  • 利用大型语言模型有效识别网络威胁情报报告中的攻击技术
  • webpack和vite区别
  • Go语言超时控制方案全解析:基于goroutine的优雅实现
  • 移动零--双指针
  • Docker 使用总结及完整示例介绍
  • 【天府诸葛杯】九天画芯 FSHD 三色光源技术晋级复赛:突围下一代底层显示技术
  • 数仓-如何保障指标的一致性
  • MySQL 索引和事务
  • 电子电路:光子是不是粒子?
  • 基于OpenCV的人脸识别:FisherFaceRecognizer算法
  • SolidWork-2023 鼠標工程
  • Java集合
  • Qt中的RCC
  • 如何避免在CMD中分段发送问题导致大模型多段回复的问题?
  • Day115 | 灵神 | 二叉树 | 二叉搜索树中的众数
  • Redis 哨兵
  • DIP依赖倒置原则
  • 第十课认识约数
  • 蓝牙身份证阅读器使用Uniapp调用二次开发demo
  • 逆向学习笔记(代码)
  • Linux `uptime` 指令详解与系统监控指南
  • 计算机体系结构一些笔记
  • C++中的继承与多态
  • 【Redis进阶】持久化
  • SpringMVC面试内容
  • 【无标题】I/O复用(epoll)三者区别▲