AUTOSAR RTE SWS文档阅读笔记

Published: 24 Apr 2016 Category: real embeded world of automotive

好记性不如烂笔头。

2 RTE概述(p60)

2.1 RTE在AUTOSAR里的上下文

运行时环境(RTE)是AUTOSAR电控单元ECU软件架构的核心,运行时环境RTE是(针对某个特定电控单元ECU)AUTOSAR虚拟功能总线的一个接口层实现。运行时环境RTE提供一些基础服务来使能AUTOSAR软件模块(SWC)之间的通讯,同时基础软件模块通过运行时环境RTE来访问基础软件模块BSW提供的服务,如操作系统OS和通讯服务。

运行时环境RTE不仅包含由于映射不同模块到电控单元ECU而产生的系统基础架构的可变元素以及标准RTE服务(The RTE encompasses both the variable elements of the system infrastructure that arise from the different mappings of components to ECUs as well as standardized RTE services.这里贴上原文,因为我的英语好烂,可能翻译有误。)。

原则上,运行时环境RTE可以划分为如下两大类实现:

  • 软件模块之间的通讯
  • 软件模块的调度

为了全面的描述运行时环境RTE的概念,基础软件调度器也需要被考虑。基础软件调度器负责调度基础软件模块BSW的可调度实体,在一些文档定义里,调度实体也被称作主(Main)功能处理函数。(所以BSW经常能看到如Fls_MainFunction类似的定义)

由于同一个操作系统任务可以用来同时调度软件模块SWC和基础软件模块BSW,所以运行时环境的调度部分是和基础软件模块强而有力的链接在一起而成为不可分离的一个整体。

对于每一个不同的电控单元ECU,其RTE是单独配置并生成的,从而保证运行时环境RTE和基础软件模块BSW的调度是最优化的(我认为性能最优指CPU/ROM/RAM综合指标)。

2.2 AUTOSAR的一些概念

2.2.1 AUTOSAR软件模块SWC

在AUTOSAR的定义里,“应用”软件从概念上说位于AUTOSAR运行时环境RTE之上并由“AUTOSAR应用软件模块”和“AUTOSAR传感器制动器模块”组成,“AUTOSAR应用软件模块SWC”和电控单元以及位置无关,而“AUTOSAR传感器制动器模块”和电控单元ECU的硬件相关因而出于性能和效率的原因其位置不可很容易的改变。也就是说,由于系统设计者引入的一些限制因素除外,一个AUTOSAR软件模块SWC在配置阶段可以部署在任何电控单元ECU上,之后,运行时环境RTE负责保证该软件模块SWC可以通讯并保证其功能依然和期望一致,不管该软件模块SWC部署在哪里。对于传感器制动器软件,其可能只需要直接访问本地的电控单元ECU抽象层即可。因此,访问远程电控单元ECU抽象层须通过一个中间传感器制动器软件模块,其会广播信息到远程电控单元ECU。因此,将传感器制动器软件模块在不同电控单元ECU上部署时,可能需要将真实的设备(传感器和制动器)也移动到那个相同的电控单元ECU上以提高访问效率。

一个AUTOSAR软件模块是被模块接口类型定义的,当一个模块被部署到不同电控单元ECU上时一个模块类型即被实例化。一个模块可以在一个电控单元上可以被多次实例化如果模块类型是可重复实例化类型。运行时环境支持每个实例都有其单独的内存空间,从而保证每个模块都有其自己的私有状态。(翻译的好差!可能都不对了)

2.2.2 基础软件模块BSW

同AUTOSAR软件模块SWC一样,一个AUTOSAR电控单元也包含基础软件模块BSW。基础软件模块BSW可以直接访问电控单元抽象层以及其他基础软件模块BSW,因此其既不是电控单元ECU无关,也不是位置无关。

一个AUTOSAR软件模块SWC不可以直接访问基础软件模块BSW,所有的通讯都是通过AUTOSAR接口并在运行时环境RTE的控制之下。

2.2.3 通讯

一个AUTOSAR软件模块SWC的通讯接口由一个至多个端口(端口类型接口)号组成,一个AUTOSAR软件模块SWC可以通过其接口和其他AUTOSAR软件模块SWC(不管软件模块SWC是在同一个电控单元ECU上还是不同电控单元ECU上)和位于同一个电控单元ECU上有端口和运行体(如服务软件模块,ECU抽象软件模块以及复杂驱动软件模块)的基础软件模块BSW进行通讯。通讯只能通过模块的端口号发生。一个端口可分类为发送者-接收者类型或者客户机-服务器类型。一个发送者-接收者接口提供了消息传送的设施而一个客户机-服务器接口提供了功能调用的接口。

2.2.3.1 通讯范例

运行时环境RTE为软件模块间的通讯都提供了不同的范例,如发送者-接收者(信号传送),客户机-服务器(功能调用),模式切换以及和非易失性数据存储软件模块之间的交互。

每一个实例可以被应用到同一分区的软件模块间的通讯(包括同一任务和不同任务之间的通讯),不同分区间软件模块的通讯,ECU之间的软件模块的通讯。同一任务间的通讯发生于不同的运行体被部署到同一个操作系统的同一个任务里,不同任务间的通讯发生于运行体被部署到同一分区内操作系统的不同任务上时,因此通讯发生时可能导致上下文的切换。分区间的通讯发生于运行体被部署到同一ECU上的不同分区上时,因此,会导致上下文的切换并且跨越保护边界(内存保护,时间保护,同一个CPU核上的隔离)。ECU间的通讯发生于软件模块的运行体被部署到不同ECU上时,因此其是通讯是并发性的,且有可能是不可靠的通讯。

注:看英文原文时,看看就过去了,当试着去翻译,呵呵,发现其实还是好又好动东西没看明白,只能说,呵呵,那些单词我都认识,组合起来,我就晕菜了。看了这儿多,RTE还是主要提供SWC之间的通讯机制啊!

2.2.3.2 通讯模式

对于接收者-发送者通讯,AUTOSAR支持两种模式:

  • 显示——软件模块调用明确的RTE接口去发送和接受数据

  • 隐式——RTE在运行体运行之前自动的读取一系列数据元素并在运行体结束运行时自动的写入更新一系列数据元素。

单词“隐式”在这里被使用是因为运行体不主动的去开始数据的传出和接收。

2.2.3.3 静态通讯

静态通讯即指在RTE生成时,通讯的源地址和目标地址已经确定的通讯链接。因为AUTOSAR的可变因素的处理机制是仅支持从一个所有可能的链接中的超大集合中的一个子集,所以静态通讯也包含了这些可能的通讯链接。

为保证运行时实时性和代码的简单性,动态的通讯配置是不被支持的,从而其通讯只支持RTE适配的那些特定的通讯设备。(好吧,我自己都晕掉了,突然觉得我的中文没英文好)

2.2.3.4 多重性

RTE不仅支持点对点(1:1)的通讯方式,同样也支持多个提供者或者要求者的通讯链接:

  • 发送者-接收者模式时,运行时环境RTE同时支持1:n(一个发送者和多个接收者)和n:1(多个发送者和一个接收者)的通讯链接模式,但有一个限制条件是多个发送者时其不支持模式切换通知。

  • 客户机-服务器模式时,运行时环境RTE支持n:1(多个客户机和一个服务器)的通讯方式,其不支持1:n(一个客户机和多个服务器)的客户机-服务器通讯方式。

2.2.4 并发性

AUTOSAR的软件模块SWC不可以直接访问操作系统接口,因此在AUTOSAR的应用程序里没有任务的概念。作为替代,AUTOSAR内部并发性的活动是基于软件模块SWC内部的被运行时环境RTE调用可运行体。

根据AUTOSAR虚拟功能总线文档,一个运行体既是可被运行时环境启动执行的一系列指令。一个模块可以有1个或者多个运行体,并且每一个运行体都有一个入口点。一个入口点既是实现了软件模块的一个运行体的函数符号。(语文好差,说白了,一个运行体入口点就是一个C语言函数名)。

运行时环境RTE负责运行体的调度——AUTOSAR软件模块SWC不支持动态的去创建私有线程。因此,所有AUTOSAR应用程序的活动是被运行体调度执行,而运行体是被RTE事件激活的。

一个RTE事件包含了所有的可以通过RTE触发运行体运行的状态。5.7.5章节详细的定义了RTE事件的类别。

(看的好烦,好多都没有实际性的帮助,可能是我还不是很理解,怎么看章节5是重点,okay,决定先把章节粗略5看一遍)

5.2 API原则

  • API要是正交的(什么鬼)—— 只有一种操作任务的方式
  • API要与编译器无关,结果是RTE API的签名不需要额外的内存修饰符如volatile
  • API要支持源代码和编译后的文件同时存在
  • API要支持软件模块的多次实例化通过共享代码的方式。

5.2.1 RTE命名空间

所有被RTE生成器生成的可见符号(函数名/全局变量等)都需要加上前缀“Rte_”。

5.2.2 直接API

直接API通常被定义为宏,根据配置在RTE生成器生成时。

5.2.3 间接API

间接API使用端口句柄(port handles)来调用RTE的API。

5.2.3.1 访问端口句柄

Rte_Ports Rte_NPorts 示例:

void TT1(Rte_Instance self)
{
	Rte_PortHandle_interface1_P my_array;
	my_array=Rte_Ports_interface1_P(self); /* 客户机-服务器接口获取 */
	int s;
	for(s = 0; s < Rte_NPorts_interface1_P(self); s++) {
		my_array[s].Send_a(23);	/* 发送请求 */
	}
}

5.2.4 在数据读访问和数据写访问角色里的变量访问

5.7.5 触发事件

#### 5.7.5.1 时间事件

#### 5.7.5.2 背景事件

#### 5.7.5.3 软件模块SWC模式事件

comments powered by Disqus