1.整个AUTOSAR存储软件栈从上到下
应用层 (ASW):提供具体的业务逻辑。
NvM:管理非易失性数据的存储。
🧱 1. NVRAM块管理
-
功能描述: NvM管理的最小数据单元称为NVRAM块(NvM Block),其组成包括:
-
NV块 (NV Block):位于非易失存储器中,保存数据本体。
-
RAM块 (RAM Block):NV块在RAM中的镜像,供应用快速读写。
-
ROM块 (ROM Block):存储NV块损坏时的默认值。
-
管理块 (Admin Block):在RAM中存储块的状态、ID等信息,对上层不可见。
-
🗂️ 2. 三种块管理类型
NvM支持三种数据管理类型,以满足不同场景的安全与冗余需求。
-
Native类型:包含1个NV块和1个RAM块,无数据冗余,适用于一般数据。
-
Redundant类型:包含1个RAM块和2个独立的NV块。在数据损坏时,NvM会尝试从另一个副本恢复,适用于关键数据。
-
Dataset类型:包含1个RAM块和最多255个NV块,可同时管理多组数据(如不同车型的配置参数),运行时通过
NvM_SetDataIndex切换。
🔒 3. 数据完整性与保护
-
CRC校验与冗余存储:NvM支持对数据进行可配置的CRC校验,并可选择
Redundant类型进行双备份存储,以应对存储介质物理损坏。 -
优先级任务队列:NvM引入了优先级机制,当启用
NvMIrPriorityQueue配置后,会形成“立即写优先级队列”和“标准FIFO队列”,确保高优先级请求(如碰撞数据)能被优先处理。 -
数据同步与作业通知:NvM采用异步机制处理耗时操作,并通过回调函数在作业完成后通知上层。
🧵 4. 同步与访问机制
-
数据同步: 隐式同步(
NvM_WriteBlock)和显式同步(NvM_WritePRAMBlock)机制,在系统启动和关闭时自动同步数据。 -
NvM与其他模块的接口交互: 向下通过
MemIf与Fee/Ea交互,向上通过客户端-服务器接口(如NvMService)为应用层提供服务。 -
错误处理: 完善的恢复机制,支持从冗余副本或ROM默认值进行恢复,并提供详尽的回调通知。
MemIf:提供统一的存储访问接口。
Fee / Ea:实现EEPROM模拟等功能。
主要实现了用Flash模拟Eeprom的核心功能。
Flash 的擦写次数有限,Fee 模块通过以下机制来均匀分布写入操作,延长 DFLASH 的使用寿命。
-
磨损均衡:通过动态地址映射,每次写入都尽量使用擦写次数较少的物理区域。
-
垃圾回收 (GC):当一个扇区的无效数据过多,可用空间低于阈值时,Fee 会触发 GC。其过程是:将所有有效数据复制到另一个扇区,然后整体擦除原扇区,使其可以再次被用于追加写入。这就完成了对存储空间的“整理”,为下一轮写入做好了准备
-
职责:通过追加写入、动态地址映射、双扇区轮换和垃圾回收,将 Flash 模拟成 EEPROM。
-
在磨损均衡中的实现(分阶段说明):
常规写入阶段:
-
维护两张表:地址映射表(逻辑块 ID → 物理地址)和 扇区状态表(记录当前激活扇区、空闲页指针)。
-
收到
Fee_Write请求后:-
在激活扇区(Active Sector)中找到下一个空闲页(该页在扇区整体擦除时已被预先清空)。
-
将数据连同 Block ID 和 Cycle Counter(写入计数) 写入该页。
-
更新地址映射表,使该逻辑块 ID 指向新的物理页。
-
将旧物理页标记为无效(invalid)。
-
触发换页(垃圾回收)阶段:
-
监控激活扇区的剩余空间,当低于阈值(例如仅剩一个页)时启动 GC。
-
锁定新写入请求(或进入 busy 状态)。
-
扫描激活扇区,找出所有仍然有效的页(未被标记为无效的块)。
-
将这些有效页按顺序复制到备用扇区(Inactive Sector,该扇区先前已被整体擦除)。
-
复制完成后,擦除整个原激活扇区(调用底层 Fls_Erase)。
-
角色互换:将原备用扇区标记为新的激活扇区,原激活扇区变为备用扇区。
-
解除锁定,继续接收新的写入请求。
-
-
关键机制:
-
Cycle Counter 用于在垃圾回收时识别同一逻辑块的最新版本(取计数值大的)。
-
地址映射表 存储在 RAM 中,上电时通过扫描 Flash 重建。
-
在EB中主要配置逻辑block,要能够与BSW的NVM是一一对应。
MemAcc:提供内存访问的硬件抽象层。
MemAcc(Memory Access)模块是AUTOSAR存储软件栈中的一个硬件抽象层。它为上层的存储服务(如 NvM)提供了一套与硬件无关的接口,用来访问下层不同类型的物理存储设备,比如内部闪存(PFlash/DFlash)或者外部EEPROM。
-
内存地址转换:将上层传来的逻辑地址映射到具体的物理存储设备和地址。
-
作业管理:负责管理读写擦等异步存储作业。当上层调用
MemAcc_Write后,它只启动一个“待处理”的作业并返回,之后驱动会通过MemAcc_MainFunction持续轮询硬件状态。上层应用还可以调用MemAcc_GetJobResult来获取最终的作业结果。 -
内存访问协调:协调多个上层模块(如
NvM和BndM)对共享内存资源的访问,管理潜在的并发冲突。 -
性能优化:通过配置,可以利用底层Mem驱动的大容量突发擦除和写入能力来提高吞吐量。
-
动态处理:支持运行时动态加载和执行存储驱动。这常用于OTA升级场景,在需要时才将Flash驱动程序下载到内存中激活,从而节约资源并提高安全性。
-
MemAcc在EB中主要配置Area映射到sector上。
Mem_DFLS / Mem_PFLS (Mem Driver):底层存储硬件驱动。
Mem_DFLS / Mem_PFLS (Mem Driver)是划分sector的地方,可以把sector分别放在几个instance下,每个sector地址连续。上层可以直接调用读写擦函数操作sector,需要注意的是,每次写都要先擦整个sector。下面是我自己封的一个写入函数,需要先擦再检查再写:
void Cdd_FlsIf_Write(uint32 addr, uint8 * data, uint32 len)
{
Std_ReturnType StdReturn = E_NOT_OK;
uint8 sector_num = len / 0x200 + 1;
StdReturn = Mem_INFLS_Erase(MEM_INFLS_INSTANCE_0_ID, addr, 0x200 * sector_num);
Example_CheckAssert(E_OK == StdReturn);
Example_ProcessJobs();
StdReturn = Mem_INFLS_BlankCheck(MEM_INFLS_INSTANCE_0_ID, addr, 0x200 * sector_num);
Example_CheckAssert(E_OK == StdReturn);
Example_ProcessJobs();
Mem_INFLS_Write(MEM_INFLS_INSTANCE_0_ID, addr, data, len);
Example_CheckAssert(E_OK == StdReturn);
Example_ProcessJobs();
}
HW:实际的物理存储设备。
2.存储设备的区别
| 维度 | RAM (SRAM/DRAM) | PFlash | DFlash | 外部 EEPROM |
|---|---|---|---|---|
| 存储性质 | 易失性(掉电丢失) | 非易失性(掉电保持) | 非易失性(掉电保持) | 非易失性(掉电保持) |
| 硬件位置 | 芯片内部 (MCU Die) | 芯片内部 (通常与MCU集成) | 芯片内部 (通常与MCU集成) | 芯片外部 (PCB上独立芯片) |
| 访问速度 | 极快 (纳秒级,与CPU同频) | 快 (但比RAM慢,有等待周期) | 较快 (比PFlash略慢) | 慢 (受I2C/SPI总线限制) |
| 访问粒度 | 字节/字/半字 (任意访问) | 页/扇区 (读可按字节,擦/写需块) | 页/扇区 (读可按字节,擦/写需块) | 字节 (可直接按字节读写) |
| 擦写次数 | 无限次 (电子开关,无磨损) | 有限 (通常1万~10万次) | 有限 (通常1万~10万次) | 较高 (通常100万次) |
| 主要用途 | 代码运行、堆栈、全局变量、堆 | 存储应用程序代码、Bootloader、常数 | 模拟EEPROM、存储频繁修改的数据 | 存储关键配置、标定参数、车辆身份信息 |

345

被折叠的 条评论
为什么被折叠?



