文章目录
- [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 的作用
- 提供跨 ECU/ECU 内部的通信环境、通讯管理。
- 提供对 runnable 的管理功能(触发、唤醒等),简单说就是 runnable 需要映射到 Task 上运行,而这个映射就是通过 RTE 实现的。
- 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 同时操作同一个数据时,可能会发生一些意想不到的问题(实际是由于优先级的问题,可能出现我们的数据被篡改的情况),而数据一致性要求不能发生这些问题。为保证数据一致性:
- 大家都操作数据的备份,不直接操作原始数据,如下文讲到的 Rte_IRead。
- 使用 SWC 内部变量,这个内部变量可以直接在配置工具中配置,runnable 可以直接调用,就类似于一个 c 文件中定义的全局变量,没有被 extern 出去。在该 c 文件中定义的函数是可以直接使用的,那么这时就会出现问题了,同一个 c 文件中的函数可能被放在不同 Task 上运行,就可能出现这些函数在同一时刻运行的状况,那么在调用这个全局变量的时候就可能出 bug。要如何解决呢?AutoSAR 做了以下两种方式:
-
EAs(ExclusiveAreas,专用区域),就是下面两句代码,相当于一个关中断的操作,调用变量的语句放在里面,运行时不能有更高级的 Task 打断被保护的语句。
cRte_Enter_<name>(); //这里放置被保护的语句 Rte_Exit_<name>(); -
IRVs(Inter-runnablevariables,跨函数变量),还是两句代码,上面的 EAs 是将整个代码段都保护了,而这里类似于改变变量的语句被保护,也就是这两句话执行的时候被保护。
cRte_IrvWrite_<re>_<name>() Rte_IrvRead_<re>_<name>()
-
-
RTE 支持对 SWC type 的实例化,SWC type 和 SWC 不同,它是指 SWC 的类型,用这个类型可以实例化 SWC,就好像用 int 类型实例化变量一样。
4.1 S/R 接口的调用方式
- 直接调用(Direct)
-
通过全局变量进行数据传输,runnable 可以直接对这个变量进行读、写操作。

-
采用如下语法,注意
<data>和data的区别,带 <> 的是指全局 data 的名字,不带 <> 的 data 是局部变量的名字。这里形参列表中使用的是指针,就是说读写操作都是操作的同一个地址,没有复制使用。同时,这些函数都是在 runnable 中使用的,不要看前缀是 Rte,就以为是 RTE 中的代码,因为调用的是 RTE 的机制,所以这里前缀是 Rte。cStd_ReturnType Rte_Read_<port>_<data> (<DataType> *data) Std_ReturnType Rte_Write_<port>_<data> (<DataType> data)
- 缓存调用(Buffered)
-
相当于将全局变量先复制到一个 runnable 的局部变量中,然后操作这个局部变量,最后再把这个局部变量赋值到全局变量中。在 runnable 操作这个局部变量期间,全局变量的值是不会改变的。
-
其对应的语法如下:
c<DataType> Rte_IRead_<r>_<port>_<data> (void) void Rte_IWrite_<r>_<port>_<data> (<DataType> data)
- 队列调用(Queued)
-
有些情况下数据不止一个,而是一组队列数据,就像我们常用的串口 FIFO,此时,可以设置循环接收或者等待接收,等待接收的话是有超时管理的。

-
其对应的语法如下:
cStd_ReturnType Rte_Receive_<port>_<data> (<DataType> *data) Std_ReturnType Rte_Send_<port>_<data> (<DataType> data)
- 跨 ECU 通讯
-
如果是跨 ECU 的数据传输,那么在 runnable 中使用 Rte_Write__() 这样的函数后,需要走
runnable(ECU1) -> RTE(ECU1) -> BSW(ECU1) -> 外部总线 -> BSW(ECU2) -> RTE(ECU2) -> runnable (ECU2),这里列出用于 COM 传输的两个函数名:cCom_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 异步调用
- 异步调用相当于有两个线程,一个线程执行我们的原函数,另一个执行被调函数,然后过一段时间去读取一下被调函数的执行结果。这时,如何知道被调函数是否执行完了呢?有三种方法:
- 循环检测,就是在那一直等,等到被调函数的返回值为止,这样的话就和同步调用差不多了,意义不大。
- 超时检测,定一个时间,时间到了就去读取,没到的时候继续运行原程序。
- 事件触发,当被调函数运行结束,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。