介绍一下AUTOSAR各个软件层之间交互的接口

接口/总线/驱动

1143人已加入

描述

AUTOSAR的三类接口

AUTOSAR中有三种类型的接口,分别是:AUTOSAR接口,标准化AUTOSAR接口和标准化接口。

  • AUTOSAR接口:用于SWC与SWC之间、SWC与BSW之间交换信息的接口。这类接口独立于特定的编程语言、ECU和网络技术。AUTOSAR接口用来定义SWC之间以及SWC与BSW之间的Port,通过这些Port SWC与SWC、SWC与BSW可以相互通信(发送或接收数据,或调用服务)。无论这些SWC与BSW位于本地ECU,还是位于不同的ECU(通过车载网络),都可以通过AUTOSAR接口实现数据交换。
  • 标准化AUTOSAR接口:标准化AUTOSAR接口也是一种AUTOSAR接口,可以看作是AUTOSAR接口的子集。它们的特别之处是这类接口的语法和语义都是被标准化的,用来定义AUTOSAR服务,这些服务是BSW提供给SWC应用软件的标准化服务。
  • 标准化接口:一种在AUTOSAR中标准化的API接口,没有使用AUTOSAR接口技术。标准化接口一般是基于特定编程语言的(如C语言),鉴于此,标准化接口往往用于同一个ECU上的软件模块之间的交互。当软件模块通过标准化接口通信,也就无法通过网络将通信路由到别的ECU上的软件模块了。

上面的描述可能有些晦涩难懂,下面这张图可以帮助大家更好地理解这三种接口的用法。

ECU软件

由上面的图可以看出,AUTOSAR接口主要用于应用软件组件(SWC)之间以及应用软件组件与基础软件之间(BSW)的通信。标准化AUTOSAR接口主要用于应用软件组件与基础软件的标准化服务之间的通信。而标准化接口则主要用于不同基础软件模块之间的通信(OS、通信模块可以通过标准化接口与SWC通信)。

AUTOSAR接口的通用规则

从之前的文章我们了解到AUTOSAR定义了不同的软件层级,不同的层级又包含很多软件模块。那么在不同的软件层级以及软件模块之间,如何使用AUTOSAR的三种接口呢,接口使用上有哪些限制呢?让我们通过一张图来了解一下。

ECU软件

这张图乍一看可能会有点一头雾水,我们来看一下这些箭头代表什么意思。

ECU软件

AUTOSAR各层软件之间的交互

下面我们通过一个例子来详细看一下AUTOSAR各个软件层之间是如何交互的,看完这个例子你将会了解:

  • 各层软件之间如何交互?
  • 软件接口看起来是怎样的?
  • ECU抽象层内部是什么?
  • 如何高效地实现抽象层?

ECU软件

这个例子将说明NVM manager和WatchDog manager如何在假定的硬件配置下与SPI驱动程序交互。

ECU硬件包含一个外部的EEPROM和一个外部的看门狗,它们通过SPI与MCU连接。

SPIHandlerDriver控制EEPROM及WatchDog对SPI硬件的并发访问,并且使WatchDog对SPI硬件访问的优先级高于EEPROM。

MCU内部包含一个Flash,它和外部EEPROM并行使用。EEPROM抽象层和Flash EEPROM Emulation拥有语义上相同的API。

Memory Abstraction Interface可以通过以下几种方式实现:

  • 运行时通过设备索引路由(internal/external)
  • 运行时通过Block索引路由(>0x03FF = 外部EEPROM)
  • 通过包含函数指针的ROM table在配置期间路由(此时Memory Abstraction Interface只是虚拟存在)

ECU软件

NVM manager通过抽象层来访问Hardware Driver,根据设备索引来区分不同的存储设备。

Memory Abstraction Interface的接口可能像下面这样:

包含设备索引、Block序号和数据缓存指针。

Std_ReturnType MemIf_Write
(
uint8 DeviceIndex,
uint16 BlockNumber,
uint8 *DataBufferPtr
)

而EEPROM抽象层和Flash EEPROM Emulation的接口可能像下面这样:

包含Block序号和数据缓存指针,由于到这一层已经索引到具体的设备了,因此不再需要设备索引了。

Std_ReturnType Ea_Write
(
uint16 BlockNumber,
uint8 *DataBufferPtr
)

NVM设备使用场景

场景一:只使用一种NVM设备类型

这是通常的用法,使用EEPROM或者Flash中的一种NVM设备。这种情况下,Memory Abstraction可以用简单的宏定义实现,该定义忽略设备索引参数。下面的例子展示了写NVM的函数定义:

File MemIf.h:

#include "Ea.h" /* for providing access to the EEPROM Abstraction */
...
#define MemIf_Write(DeviceIndex, BlockNumber, DataBufferPtr) \\
Ea_Write(BlockNumber, DataBufferPtr)

File MemIf.c: 不存在

此种情况没有运行时的额外代码,NVM manager直接访问EEPROM Abstraction 或 Flash emulation。

场景二: 使用两种或以上NVM设备类型

此时必须使用设备索引参数来选择正确的NVM设备。通过使用函数指针数组,同样可以高效地实现。下面的例子展示了写NVM的函数定义:

File MemIf.h:

extern const WriteFctPtrType WriteFctPtr[2];
#define MemIf_Write(DeviceIndex, BlockNumber, DataBufferPtr) \\
WriteFctPtr[DeviceIndex](BlockNumber, DataBufferPtr)

File MemIf.c:

#include “Ea.h“ /* for getting the API function addresses */
#include “Fee.h“ /* for getting the API function addresses */
#include “MemIf.h“ /* for getting the WriteFctPtrType */
const WriteFctPtrType WriteFctPtr[2] = {Ea_Write, Fee_Write};

由上面的例子可以看出:

  • 抽象层可以非常高效地实现
  • 根据需要,抽象层可以简化
  • Memory Abstraction Interface简化了NVM manager 对一个或多个EEPROM和Flash设备的访问。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分