本文根据AUTOSAR4.4(Classic Platform)(https://www.autosar.org/standards/classic-platform/classic-platform-440/)标准中的 :
AUTOSAR_SRS_MemoryServices.pdf
AUTOSAR_SWS_NVRAMManager.pdf
两篇文章整理。仅为个人理解,不当之处,还请指正,感谢!
AUTOSAR基本架构的介绍很多,可以自行搜索相关资料,比如 https://www.jianshu.com/p/cfffc1692ea2。
言归正传,这两篇文档主要是Memory Service 层的 Requirement 和 Specification。
1 NVRAM Block
1.1 缩写
NVRAM Block是NVM manager层所定义对象。其相关的概念和基本对象包括:
Acronym: | Description: | |
Basic Storage Object (本文简称BSO) 基本存储对象 | A “Basic Storage Object” is the smallest entity of a NVRAM Block. Several “Basic Storage Objects” can be used to build a NVRAM Block. A “Basic Storage Object” can reside in different memory locations (RAM/ROM/NV memory). | 基本存储对象是NVRAM Block的最小实体。 几个BSO组成一个NVRAM Block。 BSO可以位于不同的存储器中(RAM/ROM/NV memory) |
NVRAM Block | The “NVRAM Block” is the entire structure, which is needed to administrate and to store a block of NV data. | NVRAM Block是NVM层存储器的定义对象,用作管理和存储非易失性数据。 |
NV data | The data to be stored in the Non-Volatile memory. | 要存储在NV Memory中的非易失性数据。 |
Block Management Type block管理型类 | Type of the NVRAM Block. It depends on the (configurable) individual composition of a NVRAM Block in chunks of different mandatory/optional Basic Storage Objects and the subsequent handling of this NVRAM block. | NVRAM Block 的类型。取决于NVRAM block 的BSO构成和后续block的处理方式。 |
NV Block Header | Additional information included in the NV Block if the mechanism “Static Block ID” is enabled. | 如果BVRAN Block启用了 “Static Block ID”,则其中包含NV Block的附加信息。 |
RAM Block | The “RAM Block” is a Basic Storage Object. It represents the part of a NVRAM Block, which resides in the RAM. See [SRS_LIBS_08534] | BSO:RAM Block。对NVRAM Block来说是必需(mandatory)成分。 |
ROM Block | The “ROM Block” is a Basic Storage Object. It represents the part of a NVRAM Block, which resides in the ROM. The “ROM Block” is an optional part of a NVRAM Block. | BSO:ROM Block,位于ROM中。对NVRAM Block来说是可选(optinal)成分。 |
NV Block | The “NV Block” is a Basic Storage Object. It represents the part of a NVRAM Block, which resides in the NV memory. The “NV Block” is a mandatory part of a NVRAM Block. | BSO: NV Block。位于NV Memory(比如:Flash,EEPROM等)中,对NVRAM Block来说是必需(mandatory)成分。 |
Administrative Block | The “Administrative Block” is a Basic Storage Object. It resides in RAM. The Administrative Block contains any RAM data, that are necessary to manage the NVRAM block, for being able to perform processing on it and to deliver status information. The “Administrative Block” is a mandatory part of a NVRAM Block. | BSO:Administrative Block。位于RAM中。其中包含管理NVRAM Block所必需的的RAM数据(状态信息等)。是NVRAM Block的必需(mandatory)成分。 |
1.2 BSO和NVRAM Block 之间的组织关系如图 1 所示
图1 NVRAM 个构成(BSO)
Application(以后简称App)层的SoftWare Component(以后简称SWC)需要存储非易失性数据(NV Data)时,就使用NVM Manager 生成不同的NVRAM Block。NVRAM Block包含不同的BSO成分,每一个NVRAM Block包含哪些BSO在配置时决定,配置时每个NVRAM Block都会有一个 NVRAM block descriptor ,一旦 block descriptor 固定,则NVRAM Block的构成也就固定(fixed)了。每一个NVRAM Block都会被分配一个 Block ID,NVM模块就使用 Block ID 来选择要访问的single block。每一个NVRAM Block都可以为其配置 block management type(Native,Redundant,Dataset)。
所有地址偏移都是相对于 NVRAM block descriptor 中RAM或ROM的起始地址(这里认为是block ID,待确认)给出的。 一般认为起始地址为0。(如果需要,相应的设备驱动程序将添加设备特别定义的基址或偏移量)。
1.3 BSO的逻辑成分
下图展示了集中BSO的逻辑组成:
1.4 Block management types
前面提到:每一个NVRAM Block都可以为其配置 block management type(Native,Redundant,Dataset)。
NVRAM Block的管理类型有3种:
- native
- redundant
- dataset
每一种类型的NVRAM Block的BSO组成为:
1.4.1 Native NVRAM Block
Native NVRAM块是最简单的块管理类型。
1.4.2 Redundant NVRAM Block
包含2个NV block。如果一个 NV block 块被认为是无效(invalid)的(例如read fail),则会使用另一个有效的NV block 中的数据来恢复无效的 NV block(即将有效NV block 中的数据写到无效的 NV block中)。如果恢复失败,则应将该错误报告给DET(错误码为:NVM_E_LOSS_OF_REDUNDANCY)
1.4.3 Dataset NVRAMBlock
Dataset NVRAM Block 块中包含几个大小相同的(NV / ROM)block。 应用程序可以一次访问block中的任意一个。
(原文:The Dataset NVRAM block is an array of equally sized data blocks (NV/ROM). The application can at one time access exactly one of these elements.)
[SWS_NvM_00144] dataset 的 位置 index 在Administrative block 通过一个单独的字段来标识。
[SWS_NvM_00374] NNvM模块应能读取daset中所有的NV块。
[SWS_NvM_00375] 当且仅当禁用 write protection 时,NvM模块才能write所有的NV块。
[SWS_NvM_00146] 如果dataset NVRAM block配置了 ROM block,则index range要能涵盖ROM,即通过index 要能索引NV block 和 ROM block 。
[SWS_NvM_00376] NvM模块应只能读取ROM block(default datasets)。
[SWS_NvM_00377] NvM模块应将 write ROM block 视为 write to a protected NV block。
[SWS_NvM_00444] Dataset NVRAM Block中的 (NV + ROM)block 总数必须在1..255的范围内。
[SWS_NvM_00445]⌈在可选ROM块的情况下,索引从0到NvMNvBlockNum-1的数据区域表示NV块在NV存储器中的CRC。索引从NvMNvBlockNum到NvMNvBlockNum + NvMRomBlockNum-1的数据区域表示ROM块。
[SWS_NvM_00445] Dataset NVRAM Block中的 (NV + ROM块) 的index 关系图如下图:
先是NV block,然后是ROM block
1.5 NVRAM Manager API configuration classes
NVM 模块提供哪些API AUTOSAR 中也做了规定。但是为了适应不同的硬件资源,NVM模块可以配置哪些API在当前的环境中是可用的。为此,NVM模块中提供了一个 API configuration classes 的配置项,其有三个参数,对应不同的API范围:
—— API configuration class 3: 所有定义的API都可以使用;
—— API configuration class 2: 部分API可用,可用API的中间集合.
—— API configuration class 1: 最少的API可用,在任何情况下都需要的API最小集合。适用于硬件资源非常有限系统。
NvM module 将只包含用的到的代码,即使用宏编译开关根据配置项来决定相关的代码是否使用。
Configuration Class | No | class3 | class2 | class1 | Characteristics of Request Types |
type1 | 1 | NvM_SetDataIndex(...) | NvM_SetDataIndex(...) | NvM_GetErrorStatus(...) | synchronous request |
2 | NvM_GetDataIndex(...) | NvM_GetDataIndex(...) | NvM_SetRamBlockStatus(...) | affects one RAM block | |
3 | NvM_SetBlockProtection(...) | NvM_GetErrorStatus(...) | NvM_SetBlockLockStatus(...) | available for all SW Cs | |
4 | NvM_GetErrorStatus(...) | NvM_SetRamBlockStatus(...) | |||
5 | NvM_SetRamBlockStatus(...) | NvM_SetBlockLockStatus(...) | |||
6 | NvM_SetBlockLockStatus() | ||||
type2 | 1 | NvM_ReadBlock(...) | NvM_ReadBlock(...) | / | asynchronous request (result via callback or polling) |
2 | NvM_WriteBlock(...) | NvM_WriteBlock(...) | affects one NVRAM block | ||
3 | NvM_RestoreBlockDefaults(...) | NvM_RestoreBlockDefaults(...) | handled by NVRAM manager task via request list | ||
4 | NvM_EraseNvBlock(...) | NvM_CancelJobs(…) | available for all SW Cs | ||
5 | NvM_InvalidateNvBlock(...) | NvM_ReadPRAMBlock(...) | |||
6 | NvM_CancelJobs(…) | NvM_WritePRAMBlock(...) | |||
7 | NvM_ReadPRAMBlock(...) | NvM_RestorePRAMBlockDefaults(...) | |||
8 | NvM_WritePRAMBlock(...) | ||||
9 | NvM_RestorePRAMBlockDefaults(...) | ||||
type3 | 1 | NvM_ReadAll(...) | NvM_ReadAll(...) | NvM_ReadAll(...) | asynchronous request (result via callback or polling) |
2 | NvM_WriteAll(...) | NvM_WriteAll(...) | NvM_WriteAll(...) | affects all NVRAM blocks with permanent RAM data | |
3 | NvM_CancelWriteAll(...) | NvM_CancelWriteAll(...) | NvM_CancelWriteAll(...) | ||
4 | NvM_ValidateAll(...) | NvM_ValidatedAll(...) | |||
1 | NvM_FirstInitAll(…) | NvM_Init(...)⌋ ( ) | |||
type4 | 1 | NvM_Init(...) | NvM_Init(...) | NvM_Init(...) | · synchronous request · basic initialization · success signaled to the task via command interface inside the function itse |
Remark | 1. No queue; 2. No immediate data can be written; 3. Not support Dataset management type; 4. |
1.6 硬件抽象层的寻址方案
硬件抽象接口(即更低层的Fee和EA)为NVM提供了虚拟线性32位地址空间用于寻址,这32位地址由16bit的 block number和16bit的block address offset构成。
According to [SWS_NvM_00051], the NvM module allows for a (theoretical) maximum of 65536(2^16) logical blocks, each logical block having a (theoretical) maximum size of 64(2^16) Kbytes.
(NVM模块最多允许寻址 65536(2^16)个逻辑块,每个逻辑块的大小最大为 64(2^16) Kbytes)
16bit 的block number 被进一步划分成两部分:
- NV block base number (NVM_NV_BLOCK_BASE_NUMBER) with a bit width of (16 -NVM_DATASET_SELECTION_BITS)
- Data index with a bit width of (NVM_DATASET_SELECTION_BITS)
即: NVM_DATASET_SELECTION_BITS + NVM_NV_BLOCK_BASE_NUMBER = 16
NvMDatasetSelectionBits 在NVM module中是可配置项,用作Dataset类型的NVRAM Block中的NV block的寻址,即dataset中,NVblock的dataindex 可以为 0,1,2... (2^bit-1)。NvMDatasetSelectionBits被定义之后,则block base number的大小也随即确定(用作对base number寻址的bits个数 == 16-selectionbits), 即NVRAM Block ID可以为 0,1,2,... (2^basenumberbits-1)。
NVM模块的 NvMNvBlockBaseNumber, NvMDatasetSelectionBits 和FeeEA 模块的 EA_BLOCK_NUMBER / FEE_BLOCK_NUMBER 的关系换算关系是:
FEE/EA_BLOCK_NUMBER = (NvMNvBlockBaseNumber << NvMDatasetSelectionBits) + DataIndex.
bit 和其组合后的表示意义:
NvMDatasetSelectionBits ——> Data Index(一个NVRAM Block的NV block 的编号)
NvMNvBlockBaseNumberbits ——> NVMBlockBaseNumber(即为NVRAM Block ID,NVRAM Block的编号)
即两个类型的 bit 合计共有16个。
例 1:
NvMDatasetSelectionBits == 2 (即被配置为2bit),则可以用作NvMNvBlockBaseNumber 的是14bit。由此:
Range of NvMNvBlockBaseNumber: 0x1..0x3FFE(2^14个,即:1 ~(2^14-1-1))
Range of data index: 0x0..0x3(=2^NvMDatasetSelectionBits-1) (2^2个,即:0 ~ (2^2-1))
Range of FEE_BLOCK_NUMBER/EA_BLOCK_NUMBER: 0x4..0xFFFB (0x1<<2bit + 0)
对于一个 native NVRAM block,如果其 NvMNvBlockBaseNumber = 2:
——则其对应的NV block 在 Fee/EA 层的 FEE/EA_BLOCK_NUMBER = 8
对于一个 redundant NVRAM block(有2个NV block)如果其 NvMNvBlockBaseNumber = 3:
—— 其1st NV block (data index = 0)在 Fee/EA 层的 FEE/EA_BLOCK_NUMBER = 12 (=3<<2+0,)
—— 其2nd NV block(data index = 1) 在 Fee/EA 层的 FEE/EA_BLOCK_NUMBER = 13(=3<<2+1)
对于一个 dataset NVRAM block 如果其 NvMNvBlockBaseNumber = 4, NvMNvBlockNum = 3 (即有3个NV block):
—— 其 1st NV block(data index = 0) 在 Fee/EA 层的 FEE/EA_BLOCK_NUMBER = 16 (4<<2 +0)
—— 其 2nd NV block (data index = 1)在 Fee/EA 层的 FEE/EA_BLOCK_NUMBER = 17(4<<2 +1)
—— 其 3rd NV block (data index = 2)在 Fee/EA 层的 FEE/EA_BLOCK_NUMBER = 18(4<<2 +2)
2 功能
NVRAM Manager(Non-Volatile RAM Manager)管理所有非易失性存储器(Non-Volatile Memory)中数据的存储。其本身是独立于硬件(hardware)的,直接访问硬件的功能被封装到BSW的更下层(MemIF,Fee/EA, Fls/Eep)。NVRAM Manger 负责处理对非易失性数据的访问并对单个数据元素提供(checksum protection等)可靠性机制。为了适用于汽车系统的所有领域,NVRAM Manager具有高度的可扩展性。
3 SRS文档中:Requirements Tracing(14条BRF)
Requirement | Description | Satisfied by |
RS_BRF_00129 | AUTOSAR shall support data corruption detection and protection。
支持数据损坏检测和保护 | SRS_Mem_00030, SRS_Mem_00129, SRS_Mem_08001, SRS_Mem_08010, SRS_Mem_08545, SRS_Mem_08546, SRS_Mem_08547, SRS_Mem_08550, SRS_Mem_08552, SRS_Mem_08553, SRS_Mem_08555, SRS_Mem_08556 |
RS_BRF_01048 | AUTOSAR module design shall support modules to cooperate in a multitasking 模块支持多任务环境下协作。 | SRS_Mem_00034, SRS_Mem_08542, SRS_Mem_08558 |
RS_BRF_01064 | AUTOSAR BSW shall provide callback functions in order to access upper layer modules。 BSW通过callback函数访问上层模块。 | SRS_Mem_00125 |
RS_BRF_01076 | AUTOSAR basic software shall perform module local error recovery to the extent possible。 BSW模块可以进行本地错误恢复。
| SRS_Mem_00038 |
RS_BRF_01096 | AUTOSAR shall support start-up and shutdown of ECUs。 支持ECU的start-up 和 shutdown。 | SRS_Mem_00137, SRS_Mem_08540 |
RS_BRF_01416 | AUTOSAR services shall support standardized handling of non-volatile memory data。 service支持对非易失性数据的标准化处理。 | SRS_Mem_00013, SRS_Mem_00016, SRS_Mem_00017, SRS_Mem_00136, SRS_Mem_00138, SRS_Mem_08544, SRS_Mem_08554 |
RS_BRF_01800 | AUTOSAR non-volatile memory functionality shall be divided into a hardware dependent and independent layer。 NV memory的功能被划分成两部分:硬件独立和硬件依赖。 | SRS_Mem_00011 |
RS_BRF_01808 | AUTOSAR non-volatile memory handling shall 支持多种类型的硬件。 | SRS_Mem_08000 |
RS_BRF_01812 | AUTOSAR non-volatile memory functionality shall support the prioritization and asynchronous execution of jobs。 支持作业优先级设定和异步请求。 | SRS_Mem_00034, SRS_Mem_08543, SRS_Mem_08558 |
RS_BRF_01816 | AUTOSAR non-volatile memory functionality shall organize persistent data based on logical memory blocks。 应基于逻辑存储器块组织持久数据。 | SRS_Mem_00041, SRS_Mem_08001, SRS_Mem_08009, SRS_Mem_08528, SRS_Mem_08529, SRS_Mem_08531, SRS_Mem_08533, SRS_Mem_08534, SRS_Mem_08538, SRS_Mem_08543, SRS_Mem_08549, SRS_Mem_08560 |
RS_BRF_01824 | AUTOSAR non-volatile memory functionality shall provide a mapping of non volatile memory into random access memory。 提供NV memory到RAM memory的映射 | SRS_Mem_00027, SRS_Mem_08014,
|
RS_BRF_01832 | AUTOSAR non-volatile memory shall handle 应独立于物理地址处理逻辑存储器块。 | SRS_Mem_08007, SRS_Mem_08531 |
RS_BRF_01840 | AUTOSAR non-volatile memory functionality shall 保证存储块的完整性。 | SRS_Mem_00018, SRS_Mem_00030, SRS_Mem_00127, SRS_Mem_00129, SRS_Mem_00135, SRS_Mem_08010, SRS_Mem_08011, SRS_Mem_08015, SRS_Mem_08535, SRS_Mem_08541, SRS_Mem_08546, SRS_Mem_08547, SRS_Mem_08548, SRS_Mem_08552, SRS_Mem_08553, SRS_Mem_08556 |
RS_BRF_01848 | AUTOSAR non-volatile memory functionality shall 提供增强硬件可靠性的机制。 | SRS_Mem_00018, SRS_Mem_08529, SRS_Mem_08531, SRS_Mem_08548, SRS_Mem_08551, SRS_Mem_08554 |
3 SRS中:Requirements Specification
functional requirement 主要分为5个部分来阐述:
- configuration:在配置期间要满足那些要求,可以进行哪些操作等。
- initialization:ECU启动时的操作
- normal operation:正常功能和操作
- shutdown operation:ECU关机的操作
- fault operation:错误处理
具体条款可以参考文档,这里不搬运了。