1 简介
AUTOSAR分层架构中的存储器堆栈由以下模块组成,它为上层应用层和基础软件提供基本的内存管理服务。
-
非易失性存储器管理器- NVM(服务层) -
存储器接口- MemIf(ECU抽象层) -
Flash EEPROM模拟-FEE(ECU抽象层) -
EEPROM抽象- EA (ECU 抽象层) -
Flash 驱动程序——Fls(MCAL 层) -
EEPROM 驱动程序——Eep(MCAL 层)。
图 AUTOSAR 中的内存堆栈
2 服务类型
NvM 模块为应用程序或基础软件提供基本的同步和异步【读/写/比较】服务。
-
同步服务:同步服务是一种阻塞式服务调用,其中程序轮询服务是否完成,只有在服务完成时才返回执行。
-
异步服务:异步服务是一种非阻塞服务调用,其中对服务的请求被放置在队列中,并且通过在块配置期间配置的回调例程通知上层服务完成。
3 Memory block类型
基于强制或可选内存对象的数量,如 NV 块、RAM 块、ROM 块和管理块,存储器堆栈有不同类型的 NvM 块可以配置为,
-
原生块Native Blocks
-
冗余块Redundant Blocks
-
数据集块Dataset Blocks
NV 块是一个基本对象,它包含一个【块头、数据和一个可选的 CRC 字段】。RAM 和 ROM 块是配置的 NV 块的副本。RAM 块(可选)用于向非易失性存储器读/写数据。ROM 块(可选)用于在发生故障时恢复 NV 块的默认值。 管理块至少包含NV块的状态和长度;它可以包含更多字段。管理块中的状态字段指定 NV 块是否包含有效数据,长度字段指定 NV 块中数据的长度。
![](https://i-blog.csdnimg.cn/blog_migrate/b6304133094324623a3dd24e59f68fb5.png)
图 NV块
3.1 Native Blocks
Native Block 是一种 NvM 存储对象,它具有以下类型的强制和可选块,
NV 块(强制) – 1
RAM 块(强制)– 1
ROM 块(可选)– 1
管理块(必填) – 1
3.2 Redundant Blocks
冗余块是一种 NvM 存储对象,它具有以下类型的强制和可选块,
NV 块(强制) – 2
RAM 块(强制)– 1
ROM 块(可选)– 1
管理块(必填) – 1
3.3 Dataset Blocks
数据集块是一种 NvM 存储对象,它具有以下类型的强制和可选块,
NV 块(强制) – 1 到 255
RAM 块(强制)– 1
ROM 块(可选)– 1 到 n(其中“n”可以根据配置而变化)
管理块(必填) – 1
4 单/多块请求和处理
从应用程序发出单/多块请求时触发的基本模块流程:
4.1 单块请求
单块请求是一种只有一个 NvM 块必须写入或从 NvM 存储器读取的请求。基本的单块请求是 NvM_ReadBlock 和 NvM_WriteBlock。单块调用是系统正常运行期间最常用的服务。
4.1 多块请求
多块请求是请求将多个 NvM 块写入到 NvM 内存或从 NvM 内存读取的请求。该块可以配置为在 NvM 块配置期间用于多块服务。基本的多块调用是 NvM_ReadAll 和 NvM_WriteAll。多块调用主要用于系统启动和系统关闭期间。启动期间使用多块调用将所有最后写入的数据从 NvM 恢复到 RAM,并在关闭期间将数据从 RAM 内存存储到 NvM。
4.3 单/多块的请求处理
单块调用:当应用软件组件或基本软件模块提出单块服务请求时,该请求由 NvM 接收。NvM 模块将此请求转发给 MemIf,其中包含数据引用和硬件的块ID,在写入请求的情况下必须写入数据。在读取请求的情况下,NvM 会传递必须回读数据的块引用和块ID。MemIf 将此请求转发到层,根据 NvM 传递的设备标识符,该层可以是FEE(Flash EEPROM 仿真)或 Ea(EEPROM 抽象)。如果请求传递给FEE模块,FEE模块将其转发给 Fls 驱动程序以服务请求,或者如果请求传递给 Ea 模块,Ea 模块将此请求转发给 Eep 驱动程序。
多块调用:多块调用由 EcuM(ECU 状态管理器)模块在系统启动(NvM_ReadAll)或系统关闭(NvM_WriteAll)期间进行,以恢复上次存储的系统状态或保存当前系统状态。有两个异步多块调用 NvM_ReadAll 和 NvM_WriteAll。读取或写入配置为包含在多块调用期间的所有块,并根据放置块的内存类型触发 MemIf、Fee、Ea、Fls 和 Eep 等块。