Autosar RTE S/R接口implicit与Explicit的实现与区别

文章目录

    • 前言
    • 接口的代码
      • implicit
        • IRead
        • IWrite
      • Explicit
        • Read
        • Write
    • 区别与使用场景
    • 总结

前言

Autosar官方文档阅读起来比较费劲,一般从实际应用中来了解更多规范中的内容。本文介绍最常用的RTE S/R接口的implicit隐式与Explicit显式两种方式的实现与差别

接口的代码

implicit

IRead

隐式的接口代码最显著的特征是使用IRead.

在Autosar标准中有介绍Rte_IRead函数

函数原型:

<return> Rte_[Byps_]IRead_<re>_<p>_<o>([IN Rte_Instance <instance>],
[OUT uint8* metaDataPtr] )

Rte_Instance应该是Rte的实例,一般都只有一个,所有基本不会生成。可选的OUT参数metaDataPtr包含指向要从COM或LdCom转发的元数据字节数组

Rte_IRead返回值提供对可变数据协议类型。Rte_IRead的返回类型取决于ImplementationDataType
的VariableDataPrototype,并且可以是一个值或指向可以访问该值的位置的指针。
返回值一般都不使用宏定义直接传值

<re>表示Runnable的名称,<p>表示端口的名称,<o>表示data element的名称,[Byps_]是可选的中缀,当启用用于bypass支持的组件时会生成。

数据值总是可以读取的。提供所需的一致性API提供对数据元素副本的访问。
这保证了它在可运行实体的实际执行过程中永远不会改变。
SW-C的隐式数据读取访问应始终返回定义的数据。

以上是标准中的解释,通俗来说,就是隐式访问时需要将需要访问的数据拷贝到另一个副本中,保证读取时数据不会变化,以保证同一次读取接口的数据都是一致的

例如,使用该接口的Runnable是Runnable_10ms,Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

 #  define Rte_IRead_Runnable_10ms_Port_Test_Data_Test()  (Test_Data)

此处只是示例,Test_Data是一个全局变量。正常生成的代码中还会加入Task,Runnable,Port等的定义

假设该接口是从CAN上获取的,则实际读取的代码实现:

      /* read implicit data */
      {
        uint8 local_Test_Data;
        (void)Com_ReceiveSignal(ComConf_ComSignal_Test_Data_Message_Rx, &local_Test_Data); 
        *((&Test_Data)) = local_Test_Data;
      }
      /* call runnable */
      Runnable_10ms(); 
     

可以看到,Rte_IRead函数读取的值是在runnable调用之前赋值的。

IWrite

隐式的接口代码最显著的特征是使用IWrite.

在Autosar标准中有介绍Rte_IWrite函数

函数原型:

void Rte_[Byps_]IWrite_<re>_<p>_<o>(
[IN Rte_Instance <instance>],
IN <data>,
[IN Std_TransformerForward forwardedStatus],
[IN uint8* metaDataPtr])

Rte_Instance和IWrite中一样

<re>表示Runnable的名称,<p>表示端口的名称,<o>表示data element的名称,[Byps_]是可选的中缀,当启用用于bypass支持的组件时会生成。

输入参数 data,可以为变量值,也可以为地址,为地址时必须要保证指针在该API函数调用返回前有效

可选IN参数forwardedStatus包含变压器应在变压器链内部重建的状态。请参见ASWS TransformerGeneral[26]

可选的IN参数metaDataPtr包含指向要转发到COM或LdCom的元数据字节数组。参见[SWS_Rte_03620]。

Rte_IWrite API函数保证具有恒定的执行时间,即调用API是在同一个函数内,保证每一次发送的数据都是一致的

例如,使用该接口的Runnable是Runnable_10ms,Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

Rte_IWrite_Runnable_10ms_Port_Test_Data_Test(data)  \ 
  ( \
    Test_IWrite_Data = (data) \
  )

此处赋值的也是全局变量。

发送的函数

  Rte_IWrite_Runnable_10ms_Port_Test_Data_Test
    (loacal_Send_Data);

是一个临时变量,且是在同一函数内发送出去的,获取该临时变量值也是在同一函数内。

一般在生成的代码中,Write设置implicit属性后,除了IWrite函数,还会生成一个IWriteRef函数。该函数和IWrite的区别是不传递参数,而是直接宏定义获取变量地址,例如上述例子对应的IWriteRef函数为:

#  define Rte_IWriteRef_Runnable_10ms_Port_Test_Data_Test() \
  ( \
    &Test_IWrite_Data \
  )

一般都不会使用该函数

Explicit

Read

显式的接口代码最显著的特征是使用Read.

在Autosar标准中有介绍Rte_Read函数

函数原型:

Std_ReturnType
Rte_[Byps_]Read_<p>_<o>(
[IN Rte_Instance <instance>],
OUT <data>,
[OUT Std_TransformerError transformerError],
[OUT uint8* metaDataPtr])

此处很明显的差异,Read函数中没有Runnable的定义,也就是说,Read函数和Runnable无关
调用接口读取时,是直接读取的参数值,没有经过中间变量,这样可以保证数据的实时性

此处Out <data>传回接收到的数据,通过指针进行传递。指针必须保持有效,直到API调用返回
返回值RTE_E_OK表示接收成功,RTE_E_INVALID表示数据无效,其他的可以参考规范,在传递数据时一般不会考虑返回值,在传递总线信号时,调用Com_ReceiveSignal可以参考返回值

其他的参数和上面的类似。一般也用不到。

例如,使用Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

 #  define Rte_Read_Port_Test_Data_Test( data )  ((*(data)) = Rte_Rx_Test_Data)

读取代码:

  (void)Rte_Read_Port_Test_Data_Test(&Test_Read_Data);

调用时传递变量地址,提供给指针赋值。

Write

显式的接口代码最显著的特征是使用Write.

在Autosar标准中有介绍Rte_Write函数

函数原型:

Std_ReturnType
Rte_[Byps_]Write_<p>_<o>([IN Rte_Instance <instance>],
IN <data>,
[IN Std_TransformerForward forwardedStatus],
[IN uint8* metaDataPtr],
[OUT Std_TransformerError transformerError])

Write函数和Read函数一样,也没有Runnable的定义。通过传递IN <data> 来写入数据。

传递的类型可以是变量也可以是指针
例如,使用Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

 #  define Rte_Write_Port_Test_Data_Test( data )  (Rte_Test_Write_Data = data)

写入代码:

    Rte_Write_Port_Test_Data_Test(Test_data);

此处传递的参数是值,如果是传递的数组的话,需要传递地址。

区别与使用场景

总结一下两种方式的差别:

1.定义名称不同,implicit方式API函数中会带I,且会加入Runnable的名称

2.implicit方式不直接操作数据,在进入runnable之前RTE为数据建立副本,在runnable运行结束之后RTE把副本数据拷贝到实际数据地址。而Explicit方式直接访问数据地址

使用场景:

implicit方式适用于有一致性要求的数据组,Explicit方式适用于实时性要求高的数据

总结

RTE作为SWC和BSW的交互接口,内容还是非常多的。有时间再慢慢总结用过的API。


若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~ 你的鼓励是对小弟的最大支持~~~ 建了一个WX公众h,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js

目录 Node.js是什么 入门案例 fs文件系统模块 案例 http模块 创建最简单的web服务器 网页跳转案例 模块化 模块化概念 模块化规范 Node.js 中模块的分类 加载模块 模块作用域 module对象 Node.js中的模块化规范 第三方模块 (包) 安装包的命令 卸载包的命令 …

oracle客户端的安装教程

文章目录 一、安装前的准备工作 1.1、百度网盘安装包的连接 1.2、百度网盘oracle11g软件包 二、oracle数据库客户端的安装与数据的准备 安装步骤 前言 本文主要讲解oracle客户端的安装与简单使用过程 一、安装前的准备工作 1.1、百度网盘安装包的连接 客户端的软件包 …

【Java EE 初阶】网络编程套接字UDP

目录 1.为什么需要网络编程&#xff1f; 2.什么是网络编程&#xff1f; 3.发送端和接收端 4.请求和响应 5.客户端和服务端 6.如何进行网络编程&#xff08;Socket套接字&#xff09; 1.如何进行网络编程 2.TCP与UDP的区别 1.流套接字&#xff1a;使用传输层TCP协议 2.…

面了一个测试工程师要求月薪23K,总感觉他藏了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

【前端知识】Cookie, Session,Token和JWT的发展及区别(四)

【前端知识】Cookie, Session,Token和JWT的发展及区别&#xff08;四&#xff09; 9. JWT9.1 JWT的背景及定义&#xff08;1&#xff09;JWT的字面理解&#xff08;2&#xff09;JWT与传统Token的区别 9.2 JWT的组成&#xff08;1&#xff09; Header&#xff08;头部&#xff…

【负载均衡式在线OJ】 数据库

文章目录 41.使用Postman进行综合调试42.了解-前端预备52. 添加oj用户到MySQL53. 使用MySQL_Workbench创建表结构54. 测试录题功能55.重新设计oj_model56.编写oj_model具体代码57.MySQL综合测试58.结项与项目扩展思路 41.使用Postman进行综合调试 完善判题功能 先编译再测试 …

项目管理PMP好考吗,没有经验?

现在越来越多的产品经理和开发人员也投入到考PMP的大军中&#xff0c;在真实的项目中也会有很多产品经理兼任项目经理的职责&#xff0c;这点还是比较常见的&#xff0c;如果说产品或者开发人员考了PMP证书&#xff0c;本身也会让你在找工作的大军中更具有优势&#xff0c;俗话…

一文读懂selenium自动化测试(基于Python)

前言 我们今天来聊聊selenium自动化测试&#xff0c;我们都知道selenium是一款web自动化测试的工具&#xff0c;它应该如何去运用呢?我们接着看下去。 ​1、Selenium简介&#xff1a; 1.1 Selenium&#xff1a; Selenium是一款主要用于Web应用程序自动化测试的工具集合。Sele…

Vue事件

1&#xff0c;回顾js中的事件&#xff1f; 答&#xff1a;标签的状态变化或者被外物改变则称为事件。一般js中的事件都是由浏览器捕捉得到&#xff0c;然后传递给js引擎&#xff0c;浏览器检测到HTML页面中某个标签元素发生了指定的事件&#xff0c;而对应的DOM节点必须去调用回…

Python系列模块之标准库re详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、Python 正则表达式 1.1 re模块常用操作 1.2 re.match 1.3 re.search 1.4 re.findall 1.5 re.compile 函数 1.6 re.sub 检索和替换 1.7 re.split拆分 1.8 实战案例&#xff1a;根据文…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

vs code 配置net 开发环境.并搭配vs相似的解决方案面板

由于在本人在Linux22.04下安装Rider 一直处于卡死系统状态.不得不使用该方式 以下为安装步骤 安装 VS code https://code.visualstudio.com/Download 安装 mono https://www.mono-project.com/download/stable/#download-lin 安装 NET SDK https://learn.microsoft.com/zh…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭&#xff1b;有的品牌通过狂追当下Z世代的喜好&#xff0c;推翻经典设计&#xff1b;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下&#xff0c;羽绒服行业正在经历“地位”洗牌。 目前&…

如何在WordPress页面上显示或隐藏小部件?

您想在 WordPress 网站的特定页面上显示或隐藏小部件吗&#xff1f; 默认情况下&#xff0c;当您将小部件添加到您的网站时&#xff0c;它们将显示在所有页面上。但是&#xff0c;有时您可能只想在某些页面上显示选定的小部件可以帮助您更好地自定义您的网站并提供个性化的用户…

有哪些好用的App云测试平台?

一、国内外6种好用app云测平台推荐&#xff08;章节末附pk图&#xff09; 1、国内云测平台 1&#xff09;Testin云测 网址&#xff1a;https://www.testin.cn/ Testin云测平台是一款基于云端的移动应用测试平台&#xff0c;为移动应用开发者和测试人员提供一站式的移动应用质…

让数据背后的那些话创造价值 | 数据增长

从行业背景而言&#xff0c;流量红利逐渐消失&#xff0c;野蛮生长的互联网时代接近尾声。传统的烧钱模式、靠体力投放的形式日渐乏力。但是&#xff0c;企业总是要追求增长的。所以在行业大背景下&#xff0c;依靠技术和数据的力量寻求更科学、更高效的方法达成营销目标&#…

关注 | 蛙色元宇宙,正式成为XRMA联盟成员单位

中国虚拟现实与元宇宙产业峰会&#xff0c;2023年3月22日于杭州圆满结束&#xff0c;在杭州市人民政府、浙江省经济和信息化厅指导&#xff0c;由杭州市经济和信息化局、杭州市西湖区人民政府主办&#xff0c;中国信息通信研究院承办。 蛙色元宇宙作为元宇宙的领先企业之一&…

springboot旅游资源管理系统门票酒店预订系统_b0a6b

Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行开发的过程。config&#xff1a;主要用来存储配置文件&#…

凹函数和凸函数

凹函数英文concave&#xff0c;凸函数英文concave。 在有些参考资料中&#xff0c;凸函数又称为下凹&#xff08;concave down&#xff09;函数&#xff0c;凹函数称为上凹(concave up)函数。 凹函数和凸函数根据判定方法的不同&#xff0c;分为以下两类&#xff1a; 一元函…

虚幻商城模型转MetaHuman

一、导入虚幻商城的模型到UE 1.去虚幻商城下载一个人物模型,这里以SchoolGirl为例 2.导入UE,并找到模型,这里是SkeletalMesh 二、启动MetaHuman插件 1.通过Edit->Plugins启用MetaHuman和MetaHumanSDK插件,这里MetaHuman插件是用于创建MetaHuman的,MetaHumanSDK插件…