Autosar —— Rte 层

文章目录

  • [1. 什么是 RTE](#1. 什么是 RTE)
  • [2. RTE 的作用](#2. RTE 的作用)
  • [3. RTE 与 Runnable](#3. RTE 与 Runnable)
  • [4. RTE 与 Port](#4. RTE 与 Port)
    • [4.1 S/R 接口的调用方式](#4.1 S/R 接口的调用方式)
    • [4.2 C/S 接口的调用方式](#4.2 C/S 接口的调用方式)
      • [4.2.1 同步调用](#4.2.1 同步调用)
      • [4.2.2 异步调用](#4.2.2 异步调用)
  • [5. RTE 与 Interface 接口](#5. RTE 与 Interface 接口)
    • [5.1 AutoSAR 接口](#5.1 AutoSAR 接口)
    • [5.2 标准接口](#5.2 标准接口)
    • [5.3 标准 AutoSAR 接口](#5.3 标准 AutoSAR 接口)

1. 什么是 RTE

  • RTE 的作用就像很早之前的电话接线员(就是上个世纪那种要先打电话到接线员那里,然后再通过接线员转接电话线到目的地的方式),因为 SWC 之间或 SWC 与 BSW 之间不能直接通信,而是需要通过 RTE 进行转接。并且 RTE 具有管理这些信息的功能,比如接收的 SWC 正忙(您所拨打的用户正忙),那么由 RTE 负责让发送信息的 SWC 等待或做其他处理。RTE 还能触发 SWC,如前面 AppL 层讲的 RTE Event 触发 Runnable 调用。

2. RTE 的作用

  1. 提供跨 ECU/ECU 内部的通信环境、通讯管理。
  2. 提供对 runnable 的管理功能(触发、唤醒等),简单说就是 runnable 需要映射到 Task 上运行,而这个映射就是通过 RTE 实现的。
  3. RTE 是 VFB(虚拟功能总线)的具体实现。

3. RTE 与 Runnable

  • 通过 RTE 给 Runnable 提供触发事件 ,前面说 runnable 是可以被触发的,就是需要通过 RTE 来实现这个触发和调用,具体的触发事件参考:Autosar ------ AppL 应用层软件开发
  • 通过 RTE 给 runnable 提供所需资源,将 runnable 所需的一些资源通过接口 Port 传输给它。
  • 将 BSW 和 SWC 做隔绝,这样 OS 和 runnables 也被隔绝了,runnable 的触发条件由 RTE 提供,不能由 OS 直接提供。

4. RTE 与 Port

  • RTE 提供了实现数据一致性的机制,所谓的数据一致性,就是当多个 SWC 同时操作同一个数据时,可能会发生一些意想不到的问题(实际是由于优先级的问题,可能出现我们的数据被篡改的情况),而数据一致性要求不能发生这些问题。为保证数据一致性:

    1. 大家都操作数据的备份,不直接操作原始数据,如下文讲到的 Rte_IRead。
    2. 使用 SWC 内部变量,这个内部变量可以直接在配置工具中配置,runnable 可以直接调用,就类似于一个 c 文件中定义的全局变量,没有被 extern 出去。在该 c 文件中定义的函数是可以直接使用的,那么这时就会出现问题了,同一个 c 文件中的函数可能被放在不同 Task 上运行,就可能出现这些函数在同一时刻运行的状况,那么在调用这个全局变量的时候就可能出 bug。要如何解决呢?AutoSAR 做了以下两种方式:
      • EAs(ExclusiveAreas,专用区域),就是下面两句代码,相当于一个关中断的操作,调用变量的语句放在里面,运行时不能有更高级的 Task 打断被保护的语句。

        c 复制代码
         Rte_Enter_<name>(); 
         //这里放置被保护的语句 
         Rte_Exit_<name>();
      • IRVs(Inter-runnablevariables,跨函数变量),还是两句代码,上面的 EAs 是将整个代码段都保护了,而这里类似于改变变量的语句被保护,也就是这两句话执行的时候被保护。

        c 复制代码
        Rte_IrvWrite_<re>_<name>() 
        Rte_IrvRead_<re>_<name>()
  • RTE 支持对 SWC type 的实例化,SWC type 和 SWC 不同,它是指 SWC 的类型,用这个类型可以实例化 SWC,就好像用 int 类型实例化变量一样。

4.1 S/R 接口的调用方式

  1. 直接调用(Direct)
  • 通过全局变量进行数据传输,runnable 可以直接对这个变量进行读、写操作。

  • 采用如下语法,注意 <data>data 的区别,带 <> 的是指全局 data 的名字,不带 <> 的 data 是局部变量的名字。这里形参列表中使用的是指针,就是说读写操作都是操作的同一个地址,没有复制使用。同时,这些函数都是在 runnable 中使用的,不要看前缀是 Rte,就以为是 RTE 中的代码,因为调用的是 RTE 的机制,所以这里前缀是 Rte。

    c 复制代码
     Std_ReturnType Rte_Read_<port>_<data> (<DataType> *data) 
     Std_ReturnType Rte_Write_<port>_<data> (<DataType> data)
  1. 缓存调用(Buffered)
  • 相当于将全局变量先复制到一个 runnable 的局部变量中,然后操作这个局部变量,最后再把这个局部变量赋值到全局变量中。在 runnable 操作这个局部变量期间,全局变量的值是不会改变的。

  • 其对应的语法如下:

    c 复制代码
    <DataType> Rte_IRead_<r>_<port>_<data> (void) 
     void Rte_IWrite_<r>_<port>_<data> (<DataType> data)
  1. 队列调用(Queued)
  • 有些情况下数据不止一个,而是一组队列数据,就像我们常用的串口 FIFO,此时,可以设置循环接收或者等待接收,等待接收的话是有超时管理的。

  • 其对应的语法如下:

    c 复制代码
    Std_ReturnType Rte_Receive_<port>_<data> (<DataType> *data) 
    Std_ReturnType Rte_Send_<port>_<data> (<DataType> data)
  1. 跨 ECU 通讯
  • 如果是跨 ECU 的数据传输,那么在 runnable 中使用 Rte_Write__() 这样的函数后,需要走 runnable(ECU1) -> RTE(ECU1) -> BSW(ECU1) -> 外部总线 -> BSW(ECU2) -> RTE(ECU2) -> runnable (ECU2),这里列出用于 COM 传输的两个函数名:

    c 复制代码
     Com_SendSignal() 
     Com_ReceiveSignal()

4.2 C/S 接口的调用方式

  • 前面说过 C/S 接口就是客户端/服务端接口,这个接口就是客户端来调用服务端的操作函数的一个接口。也就是客户端程序在执行过程中,发现需要调用一个函数,而这个函数定义在其他的 C 文件中(其他 SWC),就让 RTE 帮忙调用,因为 SWC 之间无法直接通讯。
  • 举个例子,我(客户),我想要执行一个函数,这个函数写在服务端上。由于我和服务端有隔阂(SWC 之间不能直接通信),这时,我就悄悄告诉 RTE,我想要执行那个函数,RTE 就会帮我告诉服务端,让服务端执行该函数。而这里又有异步和同步两种方式:
    • 同步就是说我这个人很懒,我要等服务端运行完了这个函数,RTE 返回函数结果后,我才开始继续我的工作。
    • 异步就是我这个人很勤快,我通知 RTE 让它帮忙告诉服务端运行这个函数后,我就继续干我的事了,等过一段时间后,我估摸着函数运行结束了,我再请求函数运行结果。
  • 同步和异步调用不是通过函数名称区别的,而是事先配置好由 RTE 生成的,在配置工具中配置 runnable 的 port 时进行配置,当然要 C/S 接口才有。

4.2.1 同步调用

  • 从刚刚的例子可以看出,同步调用其实就跟我们平时调用函数是一样的,就等同于将被调函数代码嵌入到当前主调函数代码中运行。

  • 示例:

    c 复制代码
     //假如被调函数是: 
     Std_ReturnType RunnableServer(int *param) 
     //那客户端应该写的调用函数就是: 
     Std_ReturnType Rte_Call_<Port>_RunnableServer(int *param) 
     //这个param就是我们希望被调函数操作的变量

4.2.2 异步调用

  • 异步调用相当于有两个线程,一个线程执行我们的原函数,另一个执行被调函数,然后过一段时间去读取一下被调函数的执行结果。这时,如何知道被调函数是否执行完了呢?有三种方法:
  1. 循环检测,就是在那一直等,等到被调函数的返回值为止,这样的话就和同步调用差不多了,意义不大。
  2. 超时检测,定一个时间,时间到了就去读取,没到的时候继续运行原程序。
  3. 事件触发,当被调函数运行结束,RTE 可以触发原函数,告诉它被调函数运行完了,你可以读取返回值了。
  • 读取函数的代码格式:

    c 复制代码
     //执行下面的函数后就能将参数返回回来了 
     Std_ReturnType Rte_Result_<Port>_RunnableServer(int *param)

5. RTE 与 Interface 接口

  • Interface 接口总览:

5.1 AutoSAR 接口

  • 之前说的 S/R 和 C/S 接口就是 AutoSAR 接口,其所在位置包括: SWC<=>RTE、RTE<=>CDD、RTE<=>ECU AB(这里提一句,ECU AB 之前没有讲到,其实很多传感器、执行器的抽象都放在这里,其也可以看作是 SWC,IoHwAb 就在这里)。说明白一点,就是只要能看成是 SWC 处理的,就是 AutoSAR 接口。
  • AutoSAR 接口的特征是接口函数名可变 ,例如之前说过的 S/R 接口函数 Std_ReturnType Rte_Read_<port>_<data> (<DataType> *data),其中的 <port><data> 就是用户自己配置的名字,因此,这些接口的函数名都是可以改变的,但大体的形式是不变的。

5.2 标准接口

  • 标准接口就是 AutoSAR 规定的 C 语言 API 函数,其特征是接口函数名是固定不变的,是由 AutoSAR 规定好的。比如:Com_SendSignal()WaitEvent() 这类都是 API 函数名,可以由上层调用。
  • 注意,OS 和 COM 两个模块是允许使用标准接口直接和 RTE 相连的,因为 RTE 的很多功能是需要基于这两
    个模块来实现的。

5.3 标准 AutoSAR 接口

  • 其本质就是 AutoSAR 接口,只不过名称是由 AutoSAR 官方规定的,不能修改。就是标准接口和 AutoSAR 接口的特征它都有一部分,首先是和 AutoSAR 接口一样,提供的是 C/S、S/R 接口,然后又和标准接口一样,函数名是
    不可变的,说白了就是官方规定好的 C/S、S/R接口。
  • 其所在位置仅为: RTE<=>Services。
相关推荐
淬炼之火8 分钟前
笔记:Contrastive Object-Aware Fusion
图像处理·笔记·计算机视觉·多模态·图像融合
乐观主义现代人12 分钟前
redis 源码学习笔记
redis·笔记·学习
YJlio13 分钟前
Registry Usage (RU) 学习笔记(15.5):注册表内存占用体检与 Hive 体量分析
服务器·windows·笔记·python·学习·tcp/ip·django
rgc_520_zyl19 分钟前
idea离线模式使用备忘录
笔记
超龄超能程序猿41 分钟前
Docker常用中间件部署笔记:MongoDB、Redis、MySQL、Tomcat快速搭建
笔记·docker·中间件
时兮兮时1 小时前
CALIPSO垂直特征掩膜(VFM)—使用python绘制主类型、气溶胶和云的子类型
笔记·python·calipso
时兮兮时1 小时前
MODIS Land Cover (MCD12Q1 and MCD12C1) Product—官方文档的中文翻译
笔记·mcd12q1
时兮兮时1 小时前
Linux 服务器后台任务生存指南
linux·服务器·笔记
_Kayo_1 小时前
Node.js 学习笔记6
笔记·学习·node.js
De-Alf1 小时前
Megatron-LM学习笔记(8)DDP Model,Optimizer,Scheduler
笔记·学习