运行时环境 RunTimeEnvironment
1.什么是RTE?
运行时环境(RunTimeEnvironment,RTE)位于AUTOSAR软件架构的中间层,介于应用层和基础软件层之间,它实现了特定ECU上的虚拟功能总线(VFB),支持AUTOSAR的软件组件间、基础软件间、软件组件与基础软件之间的通信。RTE封装了基础软件层的通信和服务,为应用层的软件组件提供标准化的基础软件和通信接口,使得应用层可以通过API函数调用基础软件的服务,例如操作系统的任务激活、等待等功能,基础软件模块管理,ECU状态管理等服务,实现了对软件生命周期的控制。除此之外,RTE还抽象了ECU之间的通信,使用标准化的接口将其统一为软件组件间的通信,使得ECU间的通信如同ECU内部的通信。但在实现上,它需要调用基础软件中的通信部分的功能以实现各种不同总线的通信。
RTE软件设计的主要对象是软件组件和基础软件。为满足实时性、可靠性以及数据的一致性等要求,RTE向软件组件和基础软件组件提供两种机制:通信机制和并发机制。
RTE是AUTOSAR的核心,它是AUTOSAR虚拟功能总线(VFB)的具体实现。RTE衔接了应用层和基础软件层,为应用层提供标准接口来调用底层的资源,使得ECU软件的开发与具体的硬件相脱离,上层应用策略开发的人员可以更加专注于软件功能的开发,而不用纠缠于软件底层的细节。
一句话概括就是RTE提供了SWC的运行环境

2.RTE的作用
提供跨ECU/ECU内部的通信管理。
提供对runnable的管理功能(触发、唤醒等,简单说就是runnable需要映射到OS的Task上运行,而这个映射就是通过RTE具体实现的),之前提到了VFB(虚拟功能总线),RTE就是VFB的具体实现在Vector的工具链中,RTE是自动生成的。


3.RTE对Runnables的运行支撑
3.1主要特点
通过RTE给runnable提供触发事件。之前说了runnable是可以被触发的,就是需要通过RTE来实现这个触发和调用runnable,后续讲解通过RTE给runnable提供所需资源,接口通信将runnable需要的一些资源通过接口传输给它。
RTE抽象了OS,将BSW和SWC做隔绝,因此OS和runnables也被隔绝了,runnable的运行条件由RTE提供,不能由OS直接提供。
3.2触发条件
RTE给runnables提供触发条件,也就是runnable在设计的时候,需要有触发条件,不然无法运行,也就没有意义了。触发条件就是一些特定的事件,AutoSAR中主要规定了以下一些触发条件


- 初始化事件:初始化自动触发
- 定时器事件:给一个周期定时器,时间到了就触发
- 接收数据错误事件(S/R):ReceiverPort一旦收到数据,就触发接收数据错误事件(S/R)
- 数据发送完成事件(S/R):SendPort发送完成,就触发操作调用事件(C/S):当调用到了该函数的时候
- 异步服务返回事件(C/S):C/S可以在异步下运行,当调用一个Server函数,但是是异步调用的,那么该被掉函数作为一个线程和当前的运行程序并行运行,当被调函数运行结束返回(Return)的时候,这时触发异步服务返回事件
- 模式切换事件
- 模式切换应答事件
4.RTE对Ports的支撑
4.1 特征
- 作为VFB的具体实现
- 作为S/R接口的通信实现作为C/S接口的通信实现
- ECU内部通信/跨ECU(通过COM)
-
实现AR-COM的回调功能,具体实现是在SWC中完成的,RTE负责完成这个回调机制

4.2 S/R接口的不同方式
1、直接调用(Direct)
相当于有一个全局变量,runnable可以直接读写这个变量

用的是下面的语法:(注意<data>和data的区别,带<>的是指全局data的名字,不带<>的data是局部变量的名字,这里使用指针,就是说操作的是同一个地址,没有复制使用;同时,这些函数都是在runnable中使用的,不要看是Rte,就以为是RTE中的代码,因为调用的是RTE的机制,所以这里是Rte)
- RTE直接访问数据地址
- 1:n通信
- 初始值即为默认值
- 适用于实时性要求高的数据
- Std_ReturnType Rte_Read_<p>_<d>(OUT<DataType>*data)
- Std_ReturnType Rte_Write_<p>_<d>(IN<DataType>data)
2、缓存调用(Buffered)
相当于将全局变量先复制到一个runnable的局部变量中,再操作这个局部变量,最后把这个局部变量再赋值到全局变量中。在runnable操作这个局部变量期间,全局变量是不会改变的。

3、队列调用(Queued)
因为数据不止一个,是一组队列的数据,就像我们常用的串口FIFO。因此,可以设置循环接收或者等待接收,等待的话是有超时管理的。


4、跨ECU的方式
假如是跨ECU的数据传输。那么在runnable中使用
Rte_Write_<port>_<Data>()
这样的函数后,会需要走runnable(ECU1)->RTE(ECU1)->BSW(ECU1)->外部总线->BSW(ECU2)->RTE(ECU2)->runnable(ECU2),这里也列出了用于COM传输的两个函数名:
Com_SendSignal();
Com_ReceiveSignal();
4.2 C/S接口的实现
想要执行一个函数,这个函数写在别的应用侧的,但和应用侧有隔阂(SWC之间不能直接通信),这时,就悄悄告诉RTE,想要执行那个函数,RTE就会帮我告诉应用侧,让应用侧执行该函数。而这里又有两种方式:异步和同步:

同步就是说我这个人很懒,我要等服务端运行完了这个函数,RTE返回这个函数的结果后,我才开始继续我的工作;
异步就是我这个人很勤快,我通知RTE让它帮忙告诉服务端运行函数后,我就继续干我的事了,等过一段时间后,我估摸着函数运行结束了,我再请求函数结果。
C/S接口的不同方式
同步和异步调用不是通过函数区别的,这必须是事先配置好由RTE生成的,所以在Davinci中配置runnable的port时是有这个选项的(当然要C/S接口才有)。

同步调用
从上文的例子,可以看出,同步调用其实就是我们平时调用函数是一样的,就是等同于将被调函数代码嵌入当前调用的函数代码中运行即可(其实这叫直接调用,同步调用也可以mapping到task上)。

//假如我们的被调函数是:
Std_ReturnTypeRunnableServer(int*param)
//那我们的客户中应该写的调用函数就是:
Std_ReturnTypeRte_Call_<Port>_RunnableServer(int*param)
//这个param就是我们希望被调函数操作的变量

异步调用
异步调用相当于有两个线程,一个线程运行我们的原函数中的内容,另一个执行被调函数的内容。然后可以过一段时间去读取一下被调函数的返回结果。

而这时,如何知道被调函数是否执行完了呢?有三种方法:
循环检测,就是在那一直等,等到返回值为止,这样的话和同步就差不多了,意义不大;
超时检测,定一个时间,时间到了就去读取,没到的时候继续运行我的程序;
事件触发,当服务函数运行结束,RTE可以触发原函数,告诉它被调函数运行完了,你可以读取返回值了。
读取函数也用代码实际说明一下
//执行下面的函数后就能将参数返回回来了
Std_ReturnTypeRte_Result_<Port>_RunnableServer(int*param)

4.3 RTE数据一致性管理
提供了实现数据一致性的机制(所谓的数据一致性,就是说简单一点:当多个SWC同时操作同一个数据时,可能会发生一些不想看到的问题,数据一致性要求不能发生这些问题)。
1、利用RTE管理
这部分类容之前说过了,就是利用RTE来管理这里的数据,防止bug出现。比如IRead,大家都操作的是数据的备份,不直接操作原数据
2、SWC内部变量
这个内部变量就比较神奇了,因为它可以直接在DaVinci中配置,runnable可以直接调用,就类似于一个c文件中定义的全局变量,没有被extern出去。在c文件中定义的函数时可以直接使用的。那么这时就会出问题了,同一个c文件中的函数是可能被放在不同Task上运行的,就可能出现这些函数在同一时刻运行的状况,那么在调用这个全局变量的时候,就可能出bug。那么要如何解决呢?AutoSAR做了以下两种方式:
EAs(ExclusiveAreas,专用区域):就是下面两句代码,相当于一个关中断,调用变量的语句放在里面,运行时不能有更高级的Task打断被保护的语句
/*******************
Rte_Enter_<name>();
//这里放置被保护的语句
Rte_Exit_<name>();
*******************/
IRVs(Inter-runnablevariables,跨函数变量):还是两句代码,上面的EAs是整段代码段都被保护了,而这里的两句就相当于在改变变量的时候被保护,也就是这两句话执行的时候被保护
Rte_IrvWrite_<re>_<name>()
Rte_IrvRead_<re>_<name>()

支持简单和复杂的数据类型对SWC类型(SWCtype,和SWC不同,SWCtype是指SWC的一个类型,用这个类型可以

AutosarRTEinterface软件接口
标准接口
一句话概括:就是AutoSAR规定的C语言API
特征:接口函数名是固定不变的,是AutoSAR规定好的。比如:Com_SendSignal()WaitEvent()这类都是API函数名,可以有上层调用,但是一般是使用工具配置生成的,做上层应用的一般是不用关心其具体实现的。
位置:第一张图中棕色的就是标准接口,说白了就是对函数API的调用。
需要特殊说明一点的是:下图中两个红圈中的箭头,OS和COM是唯一的两个标准接口允许直接和RTE相连的。因为RTE的很多功能是需要基于这两个模块来实现的。

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

标准Autosar接口
一句话概括:就是AutoSAR接口,不过名称是由AutoSAR官方规定不能修改。
特征:就是标准接口和AutoSAR接口的特征它都有一部分。首先是和AutoSAR接口一样,提供的是C/S、S/R接口;然后又和标准接口一样,函数名是不可变的。说白了就是官方规定好的C/S、S/R接口,咱们就当成是AutoSAR接口就行了,函数名字什么不用管它。
位置:RTE<>Services,就这么一个地方。


6.代码生成阶段

问答
1.RTE替代了从前的基础软件?
错误。RTE并没有替代整个基础软件,而是作为AUTOSAR 4.x中引入的一个组件,用于实现ECU之间的通信。基础软件层(BSW)包含多个其他组件,如操作系统、诊断、网络管理等。
2.如果调用了函数Rte_Write__(),则数据会等到runnable运行结束之后才被发送?
错误。Rte_Write__()函数调用通常用于发送数据,并且是异步的。数据发送不会等待runnable运行结束,除非在特定的实现中有这样的同步机制。
3.每个ECU都需要生成不同的RTE?
正确。每个ECU的RTE实现可能会不同,因为它们需要根据ECU的具体需求和配置来定制通信机制和接口。
4.RTE仅仅处理了SWC之间的通信,包括ECU内部和ECU之间。
正确
5.如果SWC从一个ECU移动到另外一个ECU,则调用的通信函数(如RTE_Write)也会发生变化?
正确。如果SWC从一个ECU移动到另一个ECU,由于通信环境和配置可能不同,调用的通信函数可能需要相应地调整。
6.服务器的一个操作可以被多个客户端调用?
正确。在客户端-服务器模型中,服务器设计的操作通常可以同时被多个客户端访问和调用。
4203

被折叠的 条评论
为什么被折叠?



