1.存储基础知识
- RAM-随机存储器:速度快掉电丢失。
- SRAM- 静态随机存储器。特点是高性能、低集成度、速度快,一般在 MCU 或者 SOC 会内置一小块 SRAM。不需要刷新电路即能保存它内部存储的数据。
- DRAM 动态随机存取存储器,每隔一段时间固定对 DRAM 刷新充电一次,否则内部数据会消失。像现在的内存条 DDR 都属于 DRAM。
- ROM- 只读存储器,掉电不丢失,存储固化的程序和数据。
- EEPRoM:电可擦除可编程只读存储器,字节操作,价格贵,集成度低。
- FLASH:闪存,属于广义的 EEPROM,因为它也是电擦除的 ROM。FLASH 只能按照扇区(block)操作,FLASH 的电路结构比较简单,同样容量占芯片面积较小,成本比 EEPROM 低很多。FALSH 分为 NOR FLASH 和 NAND FLASH。
- NOR FLASH 数据线和地址线分开,可以实现 ram 那样随机寻址功能,也就是说程序可以在 norflash 上面直接运行,不需要拷贝到 ram 中。
- NAND FLASH 同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。
2.AutoSar 存储
图中是 AUTOSAR 的 BSW 整体架构,其中存储功能从下层到上层依次是存储驱动、存储硬件抽象、存储服务。
注意:Autosar 的存储模块主要是针对用户存放 data 数据的,也就是那些会经常变化,需要实时存储起来的数据。比如一些故障码,当 ECU 检测到一些故障码就需要实时存储起来,在维修的时候就可以通过工具读取出来分析。
Autosar 的存储模块介质主要是两种:EEPROM 和 FALSH 仿 EEPROM,分为片内和片外存储。
- 主芯片片内 FLASH 仿 EEPROM
- 主芯片片内 EEPROM
- 板载片外 FLASH 仿 EEPROM
- 板载片外 EEPROM
注意:前面讲了 EEPROM 和 FLASH 最大的不同就是 EEPROM 可以操作的最小单位是字节,也就是可以直接擦除编程一个字节。FLASH 的最小擦除单元是扇区,最小编程单元是 page 页,TC397 芯片的 DFLASH 的逻辑扇区就有 4K 大小,page页大小是 8 字节。
当前 AUTOSAR 项目开发中,使用最多的就是 TC397 芯片,该芯片是使用 397 芯片的 DFLASH 来模拟 EEPROM,用于 NVM 存储服务使用。
AutoSar 存储模块具体分层:
**NVRAM Manager:**简称 NVM,是应用层访问非易失性数据的唯一接口,提供非易失数据的管理服务。这一层会统一按 block 编号,不关心底层是什么存储类型。
**Memory Abstraction Interface:**简称 MemIf,主要作用就是将读写的信息解耦,分别分派给 EEPROM 或 FLASH。
EEPROM Abstraction: 简称 Ea,EEPROM 的抽象层,主要作用就是进一步封装片外或片内 EEPROM 驱动,给上层提供统一的 API 接口。
Flash EEPROM Emulation: 简称 Fee,Flash 模拟 EEPROM 的抽象层。
EEPROM Drv: 片内 EEPROM 的驱动
Flash Drv: 简称 fls,片内 flash 驱动
片内存储:
1、NVM->MemIf->Ea->EEPROM Drv->EEPROM
2、NVM->MemIf->Fee->FLash drv->FLASH(TC397 上使用的方案)
片外存储:
1、 NVM->MemIf->Ea->EEPROM Drv->SPI->EEPROM
2、NVM->MemIf->Fee->FLS->SPI->FLASH
3、TC397的Flash编程
当前 AUTOSAR 项目用到的主要芯片是英飞凌的 TC397 芯片。
- TC397 芯片存储分为 PFLASH(Program Flash Memory)和 DFLASH(Data Flash memory)。
- TC397 有 5 个 3MB 大小 PFx(PF0…PF4)和一个 1MB 大小的 PF5。每个PFx 被划分为 1024KB 大小的物理扇区,每个物理扇区又被划分为 16KB大小的逻辑扇区(Logical Sector)。
- TC397 有两个数据闪存存储区 DFLASH0 和 DFLASH1,就是用这个 DFLASH来模拟 eeprom,来作为 autosar 的存储服务使用的。DFLASH0 还包含了用于数据保护的用户配置块(UCBs,User Configuration Blocks)和 1个配置扇区(CFS),用户无法直接访问该配置扇区。
- DFLASH 逻辑扇区可以配置 4KB 或者 2KB,DFLASH 的页有 8 字节组成,也就是 DFLASH 最小擦除单元为 4/2K,最小编程单元为 8 字节。
- PFLASH 逻辑扇区 16KB,PFLASH 的页有 32 字节组成,也就是 PFLASH 最小擦除单元为 16K,最小编程单元为 32 字节。
在 TC397 中有一块 DFLASH,AUTOSAR 规范中是通过 DFLASH模拟 EEPROM 的形式将数据存到 DFLASH 中的。
Page: DFLASH 最小编程单元,大小为 8Byte。意味着即使只想写入 1 一个字节的数据,也会将对应的 8 字节数据重新写入。这就要求 Fee 软件层需要先读取出相应 Page 的数据,修改其中的 1 个字节,再将 8Byte 写入。
Logical Section:逻辑扇区,擦除的最小单元,由若干个 Page 构成,配置成2K,就相当于一次擦除最少擦除 2K 大小。
**Physical Section:**物理扇区,由多个逻辑扇区组成。
**Data Flash:**可以由多个物理扇区组成,我们也称物理扇区为 BANK,所需要写入的数据会最终写入到物理扇区中,一个物理扇区写满了就需要新的物理扇区,但是物理扇区是有限的,不能一直有新的 BANK,针对同一个数据如果多次写入,其实对于程序而言只有最后一次是有效的,因此如何擦除无用数据并循环使用物理扇区就是解决这个问题的关键,这就是 FEE 换页机制。
4.Fee换页机制
如果针对同一个 BLOCK 数据多次写入,并不是将原来的内容覆盖,而是在扇区中写入新的数据,而将老的数据置为无效。
不使用覆盖存储的原因:
擦除的最小单元是逻辑扇区,写入的最小单元是 Page, 逻辑扇区要比 PAGE 大很多,如果用“覆盖的”方式 意味着这个逻辑扇区中只
能存在这一个 BLOCK(避免擦除时将其他 BLOCK DATA 擦除掉。这么做会造成大量的空间浪费。另外,Data Flash 是有擦除寿命的,频繁的擦除是会减少 D-FLASH 的使用寿命。
擦除是最耗时的,每次 BLOCK 写入都要擦除原有数据再写入的话,会让效率很低。而新增写入不需要每次擦除(会统一擦除),每次只需要直接写入,在整个 BANK 写满后进行换页的时候再统一擦除。
4.1 换页机制Bank Swap
AUTOSAR FLS/FEE 的实现策略采用的是新增的方式,而非覆盖的方式,那么随着数据写入的次数增多,当前物理扇区势必存在写满的时刻,那么就需要一个新的物理扇区,但由于物理扇区的个数是有限的,不能一直有新的 BANK ,同时针对同一个 BLOCK 如果写入多次,对程序有用的数据只有最后一次,因此如何擦除无用的数据循环使用物理扇区是解决此问题的关键,这就引出了 FEE/FLS 换页机制(Bank Swap)
- 将所有 Valid 的数据拷贝到新的 Bank
- 将原来 Bank 整体擦除
- 将擦除的 Bank 作为新的 Bank 供下一次换页使用
4.2 换页时 BLOCK 写入请求
针对 BLOCK 请求分为 2 种类型,immediate / Normal。对于 immediate 的写入请求,需要打断擦除动作,立刻将新的数据写入到 New Bank 中(有的 FEE Driver 可能会写入到“第 3 块 BANK”), 原则上对于 immediate Write Request 数据是不需要等待换页完成的。对于 Normal 的写入请求,则需要等待换页完成才可以写入,因此可能出现 block 写入的时间会比较长的情况,在设计的时候需要考虑到此种情况。
Note: 在 NVM Block 配置中如果 Priority 为 0 ,则此 BLOCK 的请求为immediate request 反之为 Normal Request
4.3 如何设计BANK大小
NOTE: 一般 D-FALSH 的会规定最多擦除次数
当 FEE 作为 AUTOSAR 存储模块的核心软件层,这一层需要考虑到 FLASH 使用寿命、BLOCK 稳定写入、换页时长、启动换页阈值、BANK 大小等关键功能设计。