AUTOSAR存储模块的解释文章很多,本文整理存储模块基础知识。
存储基础知识
FEE(Flash EEPROM Emulation),即Flash模拟EEPROM。目前主流的应用,为什么要用Flash模拟EEPROM?
下面我们来看下两者之间的区别。
Non-volatile memory,非易失性存储器,就是断电后可以保存数据的存储器,Flash和EEPROM都属于这类存储器,可是它们两者之间还是有很多不同,主要有以下几个方面:
1.擦写方式不同
Flash:分为若干个Page,擦除的时候会整片擦除,写的时候必须该位为1才可以写进去,所以说,每次在Flash里修改数据的时候,要先擦除再写入。
EEPROM:写之前可以不需要擦除直接修改,可以修改单字节,读写速度较慢一点。
2.擦写次数
Flash较EEPROM较少。
3.从经济角度来看
很多芯片取消了EEPROM,用Flash模拟EEPROM来代替EEPROM以降低成本。
4.面向的需求不同
Flash:一般存储一些不容易改变的数据,如车辆的一些出厂数据(VIN码)等,因为这些数据不需要时常改变,所以存在Flash里就可以。
EEPROM:一般存储一些容易改变的数据,如故障诊断中的DTC,如果将其存在Flash里面就会不停地去擦写Flash,并且擦除面积较大,不利于操作。
FEE: 在MCU 中有一块非易失性存储器我们称之为Data Flash , 在AUTOSAR FEE/FLS 规范中,通过DATA FLASH 模拟EEP的形式将数据存储在Data Flash中。
Flash的基本概念
页(Page)、扇区(Sector)、块(Block)
Page:
由若干个字节所组成,是读写的最小单元, 比如 Page:8 bytes, 也就意味着即使向DATA FLASH 写入一个字节,也会占用Page 这么大的空间。
逻辑扇区,擦除的最小单元,其由若干Page所构成,比如 Logical Section :2K 意味着擦除的最小单元式2K Bytes
Physical Section:
物理扇区由多个逻辑扇区所构成 比如 Physical Section :20K,那么其由10个逻辑扇区所构成,一个Physical Sector包含多个Logical Sector。
块:
比扇区更高一个等级,一般1块包含多个扇区和扇区一个级别的SubSector,和块一个级别的Bank、Bulk等。
块(bank) > 扇区(sector) > 页(page)
写入操作
EEPROM通常是以一个Byte或者Word为单位写入和擦除的,即擦写是以Byte或Word为边界,这样就使得EEPROM擦写比较独立自由,也不会影响其他数据。另外,EEPROM的擦写寿命是比较高的,达百万次。
在每个存储单元保存一位信息的 EEPROM 和Flash中,存储单元的默认擦除状态读取为二进制 1。对存储单元进行编程会将其值从二进制 1 更改为二进制 0,并且擦除存储单元会更改其值 值从 0 到 1。
编程不能反向工作:只有擦除操作才能将存储单元的值从 0 更改为 1 。
Flash通常是以Word或Double-Word为写入单位,但是擦除却以Block为单位,这个Block大小往往又是以KB衡量的。这些都是半导体制造工艺或设计特性有关,这也使得Flash的容量非常大,但擦写寿命很短。
Flash Memory 具有质量轻、能耗低、体积小、抗震能力强等的优点,但也有不少局限性,主要如下:
需要先擦除再写入
Flash Memory 写入数据时有一定的限制。它只能将当前为 1 的比特改写为 0,而无法将已经为 0 的比特改写为 1,只有在擦除的操作中,才能把整块的比特改写为 1。
块擦除次数有限
Flash Memory 的每个数据块都有擦除次数的限制(十万到百万次不等),擦写超过一定次数后,该数据块将无法可靠存储数据,成为坏块。
为了最大化的延长 Flash Memory 的寿命,在软件上需要做擦写均衡(Wear Leveling),通过分散写入、动态映射等手段均衡使用各个数据块。同时,软件还需要进行坏块管理(Bad Block Management,BBM),标识坏块,不让坏块参与数据存储。
读写干扰
由于硬件实现上的物理特性,Flash Memory 在进行读写操作时,有可能会导致邻近的其他比特发生位翻转,导致数据异常。这种异常可以通过重新擦除来恢复。Flash Memory 应用中通常会使用 ECC 等算法进行错误检测和数据修正。
电荷泄漏
存储在 Flash Memory 存储单元的电荷,如果长期没有使用,会发生电荷泄漏,导致数据错误。不过这个时间比较长,一般十年左右。此种异常是非永久性的,重新擦除可以恢复。
AUTOSAR标准化的存储模块
AutoSAR中对NVM数据的存储主要包括片内存储和外部存储两种方式: 片内存储,是用芯片内部的DFLASH进行数据存储; 外部存储,是通过外部EEPROM进行存储,一般会调用SPI、IIC等通信方式外挂EEPROM芯片。
AUTOSAR分层架构中的存储器堆栈由以下模块组成,它为上层应用层和基础软件提供基本的内存管理服务。
非易失性存储器管理器 - NVM(服务层)
存储器接口 - MemIf(ECU抽象层)
Flash EEPROM模拟 - FEE(ECU抽象层)
EEPROM抽象 - EA (ECU 抽象层)
Flash 驱动程序 - Fls(MCAL 层)
EEPROM 驱动程序 - Eep(MCAL 层)。
NVM主要提供抽象数据存储,在上电读取下电存储数据,支持Immediately存储数据,将NV data在ROM和RAM之间建立关联; MemIf实现存储数据Block在内部Flash或者外部EEP的分离操作; FEE实现对Flash的数据Block的抽象和动态数据的Layout; Flash Driver提供操作Flash的接口; EA定义外部EEPROM的存储抽象和数据的Layout; EEP提供外部EEPROM的操作接口和驱动。
详细简要各模块
NVM模块
Autosar NVM位于基础软件的服务层,并为为所有NV data的(初始化、读、写、控制)维护以及管理作提供了各种同步/异步服务。
无论是EEPROM还是Flash模拟,都在这层被抽象为同一类型,直到MemIf层才会做出区分,NVM模块上层是RTE,下层是对接Flash Driver或者EEPROM Driver的接口,NVM就是属于一个连接上层APP和底层的一个接口,应用层在执行一些和存储相关的服务如写数据或者更新DTC的时候,会调用NVM里面的函数,而NVM又根据不同的需求,整合了分别调用Flash模拟和EEPROM的接口。
NvM数据操作过程中的同步机制
NvM模块为应用程序或基础软件提供基本的同步和异步服务。
同步服务:
同步服务是一种阻塞式服务调用,其中程序轮询服务是否完成,只有在服务完成时才返回执行。APP中直接调用NVM的接口对数据进行操作,此种方式不推荐使用共享的RAM Block操作,在NVM中确保RAM Block数据的一致性(主要同步CRC机制实现)。
异步服务:
异步服务是一种非阻塞服务调用,其中对服务的请求被放置在队列中,并且通过在块配置期间配置的回调例程通知上层服务完成。
NVM定义了一个RAM Mirror用于和APP进行数据交换,APP调用NvM_WriteBlock的时候写数据到RAM Block中,此时数据仍然可以被修改,因为数据还没有写到最终的Nv Block,调用NVM数据操作NvMWriteRamBlockToNvM的时候数据被Copy到内部的Mirror中,最后将数据写到Nv Block。
NVRAM 数据操作Block
NvM中对数据的操作一般叫做Basic storage objects,Basic storage objects是NvM中存储的最小单元。
Memory Service 通过将数据元素抽象成Block 进行统一管理,NvM所有的功能都是以Block为单元。
NvM管理的Block包含四种 NVRAM Block,分别为NV Block,RAM Block,ROM Block,Administrative Block。
NV block
是存储NV变量的基本结构,位于非易失性存储器中, 用于保存非易失数据。
RAM Block
由于NV变量的写入与读取都是一件相对较慢的操作,而应用层逻辑操作周期速度又太快。直接操作NV block显然不合适,所以在进行读写之前,我们会建议一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。
ROM block
用于存储默认值,以便当NV block数据出现损坏时予以替换。
Administrative block
是专门用于对NVRAM Block 与RAM blcok 的数据安全性进行管理而设计的,Administrative Block是NV RAM中必须使用的,包含了DataSet类型的NvM数据管理相关的NV RAM Block的属性、状态以及错误信息,能管理NV Block的写保护,以及上次数据操作的错误以及状态信息,它对应用层并不可见。
NvM数据的管理主要包括三种管理类型:
NVM_BLOCK_NATIVE
NVM_BLOCK_REDUNDANT
NVM_BLOCK_DATASET
Native NVRAM block
是最简单的Block形式,该类型包括:
1个NV Block,1个RAM Block,1个Administrative Blocks
NVM_BLOCK_REDUNDANT
类型的Block 包含两个 NV Block,1个RAM Block,1个Administrative Blocks,且两 NV Block 中保存的数据互为备份, 提高了数据安全性。
NVM_BLOCK_DATASET
类型的 Block 可根据需求配置多个 NV Block 或 ROM Block 并通过索引选择操作对象,提高了系统的灵活性,每一个DataSet的位置可以通过Administrative Blocks获得,NvM可以读取选择的ROM Block。
Dataset NVRAM类型的设计可以根据需要对一个数据在NvRAM中以一定的循环偏移进行存储,每一次存储位置可以不同,实现对NvRAM的寿命延长。
MemIf模块
Memory Abstraction Interface (MemIf)作为接口抽象层, 为 NvM 提供访问 Fee/Ea 模块的函数,NvM借此抽象成硬件无关的模块。
MemIf 通过Device Id将Fee 与EA 的相关接口抽象成MemIf接口供NvM访问。
MemIf 可以同时管理EA 和FEE,通过NvM Block 的 DeviceId 配置属性,进行识别,在访问对应的Device Api :
EA 的Device ID 0 和Fee 的Device ID 1
FEE模块
Fee(Flash Eeprom Emulation), 顾名思义就是Flash 模拟Eeprom. 那么为何不直接使用Eeprom,或者说Flash为什么需要模拟Eeprom。
Flash 与 EEP 都属于非易失存储器(Non-Valatile Memory),主要存在以下几点区别:
成本
同样的存储空间,EEP比Flash贵上许多,因此一般MCU上Flash空间要比EEPROM 空间大
擦写方式
Flash 以Page为单位,擦除的时候 必须按照Page 为单位擦住,同时写入的时候,只能写1,也就是由0->1,因此如果要改写某个Page的一个Byte,那么必须先将Page的内容全部读到Ram,然后改写Ram中对应的变量,然后擦除该Page,最后把Ram修改后的值写入到Page,也就是需要以下三步:读->改->写
Eeprom 支持按照Byte直接修改
Fee,就是将Flash的写入操作,通过软件的模拟成EEP。
模拟EEP写入方式
Fee 通过 Fls 模块操作 DataFlash, DataFlash 具有如下物理特性:
按页写入,写数据需为物理页的整数倍, 否则需做字节补齐。
写入前需确保此段空间未被写入过数据, 否则需要擦除后再写入数据。最小擦除单位为整个物理扇区。
Fee 的写入单元是Block,Fee Block 是继承自NvM Block,在NvM Block 数据的基础上加上Fee Block Header数据,形成Fee Block。
Fee 写入Block 按照先写入,地址就靠前的原则,下次写入Block 就依次往后排。这样确保每次写入都不需要擦除。
Fee翻页机制
Fee 通过对Flash空间整体划分为两个逻辑Sector, 一个作为Active Sector,一个作为Inactive Sector。这两个Sector 由一个或者多个物理Sector组成。
在任意时间,只能有一个Logical Sector在作为 Active Sector只有当Active Sector,如何写入下一个Block,或者达到配置的剩余空间,那么就会进行翻页操作。
翻页操作一般会经历如下几个步骤:
将所有Block的最新数据写入到Inactive Sertor
擦除Active,设置Inactive Sector为Active
注意,这里翻页操作时,并没有将所有的数据都由Active Sector搬运到Inactive Sector,而是将所有Block的最新数据搬运到Inactive Sector。
假设我们的MCU的Data Flash有两个扇区,将两个扇区分别标记为逻辑扇区1(logical sector 1)和逻辑扇区2(logical sector 2)。
假设我们要用Flash模拟EEPROM来存储DTC,我们都知道DTC是个很小的数据,但是更新可能会比较频繁,如下图:
首先,逻辑扇区1(logical sector 1)是空白的等待我们写入数据,属于工作片区(Actived)。
假设Flash一次性可以写8个字节,我们可以这样划分:前4个字节来存储DTC标识,后4个字节来存储具体DTC,每次DTC有更新我们就接着往没有被写到的空间更新数据,直到逻辑扇区1(logical sector 1)被写满,我们将最新的DTC数据复制进逻辑扇区2(logical sector 2)里面,然后擦除整片逻辑扇区1(logical sector 1)。
这时,逻辑扇区1(logical sector 1)状态变成(Not Actived)待工作片区,逻辑扇区2(logical sector 2)变成(Actived)工作片区,等逻辑扇区2(logical sector 2)写满再将最新数据复制到逻辑扇区1(logical sector 1),然后擦除逻辑扇区2(logical sector 2),这样来回反复,大致工作流程是这样的。
Fee 初始化读取地址
Fee 提供地址管理机制,Fee 会在Ram中实施记录所有Block的当前地址和状态,在Block写入新的数据时,又会更新这个地址。
这些地址主要用于Fee读取Block数据。
在Fee进行初始化之前,这些Block地址是未知的,因此需要在Fee 初始化阶段,需要从Flash 遍历得到当前Blcok的地址。
EA模块
由于EEP是可以支持直接写入的,因此存储在Eep的Block地址都是固定的,EA模块为EEPROM 硬件抽象层, 通过访问下层 Eep 模块提供的 API 操作 EEPROM 硬件, EEPROM 具有如下物理特性:
可按字节写入,写入前不需执行数据擦除操作。
Ea 可为每个 Block 确定具体的硬件存储地址并划分存储空间,NvM 在执行读/写等服务时,通过 Ea 完成相应 Block 的地址映射即可操作EEPROM 硬件中数据。
EA地址管理
通过获取 NvM Block 的类型、 长度等配置, Ea 按照各 Block 的长度为其分配地址空间,从 0 地址起依次向后排列。
EA Block 写入管理
EA Block 中包含块状态标识位,该标识位会存入 Eeprom 中,通过该字段可以判断当前 Block 是否有效。
在读任务若发现标识位为无效的状态,则直接向上层返回 MEMIF_BLOCK_INVALID 失败状态;
若发现标识位不为有效/无效值,则直接向上层返回 MEMIF_BLOCK_INCONSISTENT失败状态。
FLS模块
Flash驱动提供独立于硬件访问Flash内存的机制,提供用于读写和擦除Flash的服务驱动。
审核编辑:汤梓红
评论
查看更多