Rte模块


前言

本文主要介绍AUTOSAR中RTE模块相关内容。

一、RTE是什么?

AUTOSAR RTE(Run Time Environment)实现了AUTOSAR系统中的虚拟功能总线(VFB),提供了SWC(Software Component)之间的访问接口和SWC对于BSW资源的访问接口。RTE为SWC中的Runnable提供与其他SWC或者BSW模块通信的接口,RTE将Runnable映射到OS Task中,并且管理Runnable的触发机制。 因此RTE功能主要可以分为三个部分:

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

二、Rte的作用

1.Rte为Runnable提供运行环境

Swc中的Runnable函数需要在系统的Task中运行,Rte为Runnable提供触发事件(如定时事件,初始化事件等),并给Runnable提供所需资源(在Rte中经过Port通信,将Runnable所需的资源传输给它)。

Rte将BSW与SWC之间隔绝。SWC的Runnable函数通过Rte被映射到BSW中OS的Task上运行。

2.Rte中Port的作用

  • 作为SWC和BSW之间的沟通桥梁
    • C/S接口的通信实现,S/R接口的通信实现,ECU内部通信/跨ECU通信(通过COM总线实现跨ECU通信
  • 提供实现数据一致性的机制。(多个SWC同时操作一个数据时,要保证数据一致性,即在多个SWC中数据的内容和状态保持一致)
  • 支持简单(int)和复杂(structure)的数据类型
  • 对SWC类型的实例化(SWC Type,指的是SWC的一个类型,用这个类型可以实例化一个SWC。)

3.Rte对数据一致性的管理

  1. 利用RTE管理。比如IReadIWrite,就是隐式通信,操作数据的备份而不直接操作原数据。
  2. SWC内部变量
    配置在SWC的内部变量可以直接由Runnable调用,类似于一个c文件中定义的全局变量,没有被extern出去,在c文件中定义的函数是可以直接使用该全局变量的。 那么存在一个问题,同一个c文件的函数(即一个SWC的Runnable)可能被放在不同的Task上运行,就可能出现这些函数在同一时刻同时运行的情况,那么在调用这个全局变量的时候就可能出现异常。针对此问题,Autosar采取以下两种方式来解决:
    1. EA(Exclusive Area,临界区)
      相当于一个关中断,调用变量的语句放在里面,运行时不能有更高级的Task打断被保护的语句。
      ......
      Rte_Enter_<name>();
      //这里放置被保护的语句
      Rte_Exit_<name>();
      ......
      
    2. IRV(Inter-runnable variable)
      IRV变量只有在保留在对应的SWC内部,其他SWC无法访问。还是两句代码。当执行这两句代码时,不能被其他Task打断
      Rte_IrvWrite_<re>_<name>()
      Rte_IrvRead_<re>_<name>()
      

三、RTE如何实现通信

AUTOSAR软件组件的通信接口由多个端口组成。AUTOSAR软件组件可以通过它的接口与其他AUTOSAR软件组件(无论该组件位于同一个ECU或不同的ECU上)或同一ECU上的基础软件模块进行通信。此通信只能通过组件端口进行。端口可以归为两类:发送方-接收方,客户端-服务端。发送方-接收方提供消息传递功能,客户端-服务端提供函数调用。

1.通信模式

RTE为SWC实例间的通信提供了不同的样式:

  • 发送方-接收方(sender-receiver)(信号传递,比如全局变量)
  • 调用方-被调用方(call-result)(函数调用)

对于发送方-接收方(sender-receiver)通信,RTE提供两种模式:

  1. 显式(Explicit):组件使用显式API调用发送和接收数据单元;
  2. 隐式(Implicit):RTE在调用可运行实体之前自动读取指定的一组数据集单元,并且在可运行实体终止后自动写入(不同的)一组数据集单元。这里使用术语“隐式”是指可运行实体不会主动发起数据的接收和传输。

以全局变量的方式举例,简单来说,显示通信就是直接对全局变量进行操作,每次通信都是对最新的全局变量直接进行读写;隐式通信则会先生成一个全局变量的副本,隐式通信都是对该变量副本进行读写,只有在该次通信结束后才会将变量副本的最新值写入全局变量。

RTE应仅支持静态通信。静态通信仅包括那些在生成RTE时所有通信的源和目的就已知的通信连接。由于运行时间和代码开销会限制适用RTE的设备规模,因此不支持通信的动态重新配置。

2.通信多样性

除了点对点通信,RTE还支持含有多个Provider或多个Requester的通信连接。

当使用Sender-Receiver通信时,RTE支持1:n(即一个Sender,多个Receiver),n:1(即多个Sender,一个Receiver)的通信,并且限制不允许多个发送方进行模式切换通知。

RTE不协调多个Sender或多个Receiver的执行过程,这意味着不同软件组件的行为是独立的,RTE不确保不同发送方同时传输数据,也不确保所有Receiver同时接收数据或接收事件。

当使用Client-Server通信时,RTE支持n:1(即多个Client,一个Server)通信,不支持1:n(即一个Client,多个Server)通信。

无论使用1:1,n:1,1:n通信,RTE负责实现通信连接,因此,AUTOSAR软件组件不知道具体配置,这样就允许一个AUTOSAR软件组件在不修改的情况下重新部署到不同的配置中。

四、Rte如何管理Runnable

生成Rte前需要先配置Rte。即将Swc的Runnable放到OS中对应的Task中,并确定每个Runnable在Task中的优先级。

Rte给Runnable提供触发条件,也就是Runnable在设计的时候,需要有触发条件,否则无法运行。在Davinci中,是通过配置Trigger来触发Runnable的。具体来说,Rte提供以下几种方式来支撑Runnable的运行

  • 周期执行:在指定的时间间隔内循环执行。(定时器事件)
  • 事件触发:在接收到指定的事件时执行。(接受数据事件、操作调用事件、初始化事件等)
  • 状态触发:在系统状态发生改变时执行。(模式切换事件、模式切换应答事件)

五、RTE生成过程

在这里插入图片描述
上图给出了关于SWC和RTE生成器软件的RTE生成步骤。让我们详细了解每个步骤:

  1. Collection of available SWC implementations 此步骤包括收集SWC描述文件(如果打算重用旧SWC)及其各自的Composition SWCs并进一步使用它们。或者我们也可以创建新的SWC实现并将其用于进一步的步骤。
  2. Configure System 本步骤结合了上个步骤中的SWC,并配置了系统(整车ECU网络),该系统具有不同ECU和其他系统约束的不同组成SWC。在此步骤中,所有SWC都映射到各自的ECU。
  3. System Configuration Description 系统配置描述的arxml文件,其中包含整个系统(车辆)的ECU的详细信息,该文件在系统配置后生成。
  4. Extract ECU Specific Information 提取特定ECU的SWC描述和其他详细信息,不同于包含车辆中所有ECU信息的系统配置描述文件。
  5. Generate ECU Configuration 生成ECU配置,此步骤涉及配置RTE下层BSW中模块比如COM Service等模块的配置,这一步生成的也是一个arxml文件其包含所有ECU的信息,比如BSW的配置,SWC的配置等。
  6. Generate RTE 此步骤中,所有Runnables映射到操作系统任务,所有connetions连接到实际的信号。此步骤的输出为Rte.c和Rte.h文件,大致可以称为AUTOSAR的RTE层。此步骤还生成BSWMD(基本软件模块描述)文件,其中包含RTE不同功能的信息。
  7. Compile RTE 顾名思义,在这一步中,将编译RTE文件,并生成目标文件(.o文件),然后将这些文件与其他已编译的BSW和SWC文件链接(.hex文件),以生成可刷写到MCU的可执行文件(.exe文件)。

六、Rte生成文件之间的关系

在RTE生成之后,RTE生成器工具会生成许多文件,其中的头文件与其他文件有关系,即这些文件被#included到不同的文件中。这些文件以及它们与其他文件的关系如下:

  1. Rte.h:这个文件定义了不需要为每个ECU生成的固定元素,因为这个RTE生成器软件不会一次又一次地生成这个文件。但是,如果需要,我们可以定制此文件以满足我们的应用程序。该文件包括Std_Types.h文件(#include <Std_Types.h>)。
  2. Std_Types.h:该文件是标准的AUTOSAR文件,它定义了基本数据类型,如无符号和有符号整数的平台特定实现,并提供了访问编译器抽象的方法。
  3. Rte_Main.h这是生命周期头文件,其中包含RTE生命周期API的函数原型,如Rte_Start和Rte_Stop 。有些软件还增加了更多的生命周期API,用于RTE内存的初始化等。这个文件包括Rte.h文件。
  4. Rte_XX.h:这是特定于应用程序的RTE头文件,文件名的前缀始终是Rte_,后缀是与此RTE应用程序文件关联的 SWC 名称。该文件包含与 SWC 相关的 SWC 中使用的RTE API的函数原型、数据结构和Runnable的函数原型。该文件包括Rte_Type.h和Rte_DataHandle.h 文件
  5. Rte_Type.h此文件包含从在SWC配置期间配置的**实现数据类型(IDT)**派生的RTE特定类型声明==。此文件还包含对RTE API有用的AUTOSAR数据类型。==该文件包括 Rte.h 文件。
  6. Rte_DataHandleType.h:==此文件包含SWC数据结构所需的数据句柄类型声明。==该文件不包含任何会占用内存的符号。
  7. Rte_XX_Type.h:这也称为应用程序类型头文件,它包含与应用程序相关的常量,如SWC中使用的范围值或枚举值。该文件包括Rte_Type.h文件

七、RTE API

RTE提供多种API以便SWC使用从其他SWC或者底层访问数据。RTE APIs可以简单的根据任何函数的Rte_prefix识别。

常用的API如下:

  • Rte_Read:通过传参读取全局变量的值。
Rte_Read_<port>_<data>(<IDT>* data)
{
	Std_ReturnType ret = RTE_E_OK;
	*(data) = Rte_<swc>_<port>_<data>;	//全局变量 Rte_<swc>_<port>_<data> 已经提前声明
	return ret;
}
  • Rte_DRead:直接显示读取全局变量
Rte_DRead_<port>_<data>()
{
	return Rte_<swc>_<port>_<data>;	//全局变量 Rte_<swc>_<port>_<data> 已经提前声明
}
  • Rte_Write:通过传参写入全局变量的值
Rte_Write_<port>_<data>(<IDT> data)
{
	Std_ReturnType ret = RTE_E_OK;
	Rte_<swc>_<port>_<data> = data;	//全局变量 Rte_<swc>_<port>_<data> 已经提前声明
	return ret;
}
  • Rte_IRead:隐式读取全局变量。不需要额外声明函数
#define Rte_IRead_<port>_<data>() (Rte_<swc>_<port>_<data>)
  • Rte_IWrite:隐式写入全局变量。不需要额外声明函数
#define Rte_IWrite_<port>_<data>( data ) (Rte_<swc>_<port>_<data> = data)
  • Rte_Send:以队列的形式写入全局变量

  • Rte_Receive:以队列的形式读取变量

  • Rte_Call:依靠队列的形式进行函数调用。分为同步调用和异步调用。

  • Rte_Result:返回函数调用结果。

  • Rte_Switch:切换当前模式


总结

这里RTE模块以及RTE生成器做了简单介绍,后续内容会持续更新。

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值