Autosar架构---深度探索存储相关内容

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 来获取最终的作业结果。

  • 内存访问协调:协调多个上层模块(如NvMBndM)对共享内存资源的访问,管理潜在的并发冲突。

  • 性能优化:通过配置,可以利用底层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)PFlashDFlash外部 EEPROM
存储性质易失性(掉电丢失)非易失性(掉电保持)非易失性(掉电保持)非易失性(掉电保持)
硬件位置芯片内部 (MCU Die)芯片内部 (通常与MCU集成)芯片内部 (通常与MCU集成)芯片外部 (PCB上独立芯片)
访问速度极快 (纳秒级,与CPU同频) (但比RAM慢,有等待周期)较快 (比PFlash略慢) (受I2C/SPI总线限制)
访问粒度字节/字/半字 (任意访问)页/扇区 (读可按字节,擦/写需块)页/扇区 (读可按字节,擦/写需块)字节 (可直接按字节读写)
擦写次数无限次 (电子开关,无磨损)有限 (通常1万~10万次)有限 (通常1万~10万次)较高 (通常100万次)
主要用途代码运行、堆栈、全局变量、堆存储应用程序代码、Bootloader、常数模拟EEPROM、存储频繁修改的数据存储关键配置、标定参数、车辆身份信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值