目录
在前面 关于接口的一些说明,点击跳转)中,简要介绍了CP_AUTOSAR分层软件接口常用规范的一些说明,本文以内存服务中的软件模块为对象,介绍软件层之间的通信交互。
关于内存服务中的软件模块,先抛出以下几个问题:
1、内存服务中的软件模块,各自的特征以及彼此之间的差异是什么?
2、分层的软件架构中,是如何通信交互的?
3、软件接口是什么样的?
4、如何实现抽象层是最有效率的?
1、Memory service modules 特征及差异
不同的服务模块(即内存管理器)都是从非易失性存储抽象而来,但硬件特性会对管理器的设计、访问是如何实现的产生影响;
NV(non-volatile)内存硬件的不同,决定了内存服务软件模式的使用约束;
下表列出了内存服务软件模块以及相应的NV内存特性:
模块 | 使用案例及特征 | NV特性 | 硬件案例 |
---|---|---|---|
NVM | 1、软件模块中数据存储(比如错误信息,特殊的配置信息,状态信息以及诊断数据); 2、支持同步读写(BSW和SWC); 3、ECU上电时读取,在下电时写入,也支持正常运行期间的突然读/写; 4、数据大小约占几KB; |
1、直接(通过内存映射)和间接(通过SPI总线)访问NV内存; 2、串行访问(在同一个HW部分,同时读写可能无效); |
1、Internal data flash; 2、External eeprom /data flash; |
BndM | 1、存储车辆指定数据; 2、通过诊断方式写入; 3、支持SWCs同步读取; 4、直接访问指针; 5、数据大小KB; |
1、需要直接访问(通过指针)NV数据; 2、同步读取NV数据; |
1、Internal data flash; 2、Internal code flash; |
FOTA | 1、存储指定车辆数据和代码; 2、数据大小MB; 3、比如,在几次驾驶循环之后可能会写入新的数据; |
1、同时读写(如通过内存抽象) | 1、Internal and external code flash |
2、Memory 如何通信交互
2.1、Memory通信架构
以下的案例展示了NVRAM Manager 和 Watchdog Manager是如何在假定的硬件配置中与驱动进行交互的。
该ECU的硬件包含了一块外部EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦可编程只读存储器 )和一个通过SPI连接到微控制器的外部看门狗。SPIHandlerDriver驱动控制外设的同时访问,需要分配给watchdog更高优先级的访问权。
微控制器上有一块内部闪存,用于同步访问外部EE。EEPROM Abstraction 和 Flash EEPROM Emulation具有语义相同的API。
Memory Abstraction接口可以通过如下方式实现:
1、基于设备索引(内部/外部),在运行时决定使用哪个闪存设备进行读写操作;
2、基于时钟索引(比如 > 0x1FF是外部EEPROM),在运行时决定使用哪个闪存设备进行读写操作;
3、在配置时通过NVRAM Manager中带有功能指针的ROM表,决定使用哪个闪存设备进行读写操作
2.2、大块的NV数据管理
BndM(Bulk NV Data Manager,大块非易失性数据存储管理):不经常性写入且尺寸巨大的连续性数据。
NVM(NVRAM Manager,Non-Volatile Random Access Memory Manager,非易失性存储器管理器):经常性更新且尺寸较小的连续性数据。
比如,当DCM模块收到$2E服务 UDS中2E服务可以参考该文档,点击跳转 ,需要写入较大的数据时,会通过BndM模块直接驱动flash写入。
3、Memory 软件接口
架构图描述:
NVRAM Manager通过内存抽象接口(Memory Abstraction Interface)访问驱动,通过设备索引来访问不同内存的地址。
接口描述:
Memory Abstraction Interface,内存抽象接口有如下接口函数(比如,写函数)
Std_ReturnType MemIf_Write
{
uint8 DeviceIndex,
uint16 BlockNumber,
uint8 *DataBufferPtr
}
EEPROM Abstraction 和 Flash EEPROM Emulation有如下接口函数(比如,写函数)
Std_ReturnType Ea_Write
{
uint16 BlockNumber,
uint8 *DataBufferPtr
}
4、内存抽象接口的实现
3.1、情况1:只使用了一种NV设备类型
这种情况是通常使用情况,Memory Abstraction可以使用忽略了设备索引参数的宏定义来实现,以下是写函数的案例:
#define MemIf_Write(DeviceIndex, BlockNumber, DataBufferPtr) \
Ea_Write(BlockNumber, DataBufferPtr)
结果:NVRAM Manager可以直接访问EEPROM Abstraction或者是Flash Emulation。
3.2、情况2:使用了2种或更多的NV设备
这种情况下,设备索引参数必须被使用,以确保选择正确的NV设备。可以用过一组函数指针来快速实现,以下是写函数的案例:
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};
结果:在实现功能时,无论函数指针表是在NVRAM Manager(非易失性随机存取存储器管理器)内部还是在其他地方,所使用的代码和运行时行为都应该保持一致。
4、结论
Abstraction Layers可以被高效实现;
Abstraction Layers是可以被拓展的;
Memory Abstraction Interface简化了一个或者多个EEPROM 和 Flash设备。