1、概述
FEE(Flash EEPROM Emulation),即Flash模拟EEPROM
Non-volatile memory,非易失性存储器,就是断电后可以保存数据的存储器。Flash和EEPROM都属于这类存储器,可是它们两者之间还是有很多不同,主要有以下几个方面:
1.擦写方式不同
Flash:分为若干个Page,擦除的时候会整片擦除,写的时候必须该位为1才可以写进去,所以说,每次在Flash里修改数据的时候,要先擦除再写入。
EEPROM:写之前可以不需要擦除直接修改,可以修改单字节,读写速度较慢一点。
2.面向的需求不同
Flash:一般存储一些不容易改变的数据,如车辆的一些出厂数据(VIN码)等,因为这些数据不需要时常改变,所以存在Flash里就可以。
EEPROM:一般存储一些容易改变的数据,如故障诊断中的DTC,如果将其存在Flash里面就会不停地去擦写Flash,并且擦除面积较大,不利于操作。
在AUTOSAR架构中,FEE处于内存硬件抽象层(Memory Hardware Abstraction)。
Flash EEPROM仿真(FEE)应该从设备特定的寻址方案和分段中抽象出来,并为上层提供虚拟的寻址方案和分段,以及“实际上”无限数量的擦除周期。
2、概念介绍
几个概念如下描述,下图只是便于理解。
2.1、Bank
Bank:“Flash模块”包含单独的“Bank”。在PFlash中有一个或多个PFx Bank,在DFlash中有两个DFx Bank。“Bank”支持并发操作,但由于通用逻辑存在一些限制。包含多个物理扇区,与其他内存进行物理隔离。
举个简单的例子:PF1与PF0属于不同的Bank,两个不相互影响。
2.2、Block
BlockBlock属于Autosar的一个概念,人为划分定义的。
FEE (Flash EEPROM Emulation)这样定义Block:
Smallest writable/ erasable unit as seen by the modules user. Consists of one or more virtual pages.
即: Block是用户操作的最小写/擦除单位,可以由一个或者多个虚拟页组成。Block的大小可以根据项目的实际情况设置, eg: 200Byte。虚拟页(Virtual page)由一个或者多个物理Page构成,按照大小排序如下所示: Bank> Physical Sector> Logical Sector > Page。
2.3、Physical Sector
物理扇区,一个Bank包含多个Physical Sector,一个Physical Sector包含多个Logical Sector。
2.4、Logical Sector
逻辑扇区,硬件定义一次可擦除的最小单元。
2.5、Page
物理意义上的最小可写单元,比如 Page:8 bytes,写入的话,只能按照页的倍数进行操作。
看一个Tc275的例子
3、功能描述
3.1、寻址方案和分段
Flash EEPROM仿真(FEE)模块为上层提供32位虚拟线性地址空间和统一的分段方案。这个虚拟32位地址应该包括
·一个16位的块号 - 允许(理论上)65536个逻辑块的数量
·16位块偏移量-允许(理论上)块大小为每个块64KByte
16位块号表示一种可配置的(虚拟的)分页机制。此地址对齐的值可以从底层闪存驱动器和设备的值派生。这个虚拟分页可以通过参数进行配置FeeVirtualPageSize.
Fee模块的配置应该使虚拟页面大小(在FeeVirtualPageSize中定义)是物理页面大小的整数倍,(实际配置,不是会自动补齐,因为已经虚拟化了Fls,感觉这个概念更偏向于Fls的要求一样)即不允许配置比实际物理页面大小更小的虚拟页面。
注意:AUTOSAR规范要求允许计算逻辑块的物理起始地址,而不是创建地址映射所需的查找表。
例子:虚拟页的大小配置为8个字节,因此地址对齐是8个字节。块号为1的逻辑块位于物理地址x,块号为2的逻辑块位于x+8,块号为3的逻辑块位于x+16。
每个配置的逻辑块应该占用配置的虚拟页大小的整数倍。
例子:通过相应地设置参数FeeVirtualPageSize,将地址对齐/虚拟分页配置为8个字节。逻辑块号1被配置为32字节的大小(参见下图)。这个逻辑块正好使用4个虚拟页面。因此,下一个逻辑块将获得块号5,因为块号2、3和4被第一个逻辑块“阻塞”了。第二个块的大小配置为100字节,占用13个虚拟页面,最后一个页面的4个字节未使用。因此,下一个可用的逻辑块号将是17。
逻辑块不能相互重叠,也不能相互包含。
3.2、地址计算
根据FEE模块的实现和所使用的确切地址格式,FEE模块的功能应结合16位块号和16位地址偏移量来导出底层Fls驱动器所需的物理闪存地址。
注意:底层Fls驱动器所需的确切地址格式以及如何从给定的16位块号和16位地址偏移量中派生物理闪存地址的机制取决于闪存设备和该模块的实现,因此不应标准化。
只有16位块号中不表示特定数据集或冗余副本的那些位才用于地址计算。
注意:由于NVRAM管理器需要此信息,因此可以使用参数NVM_DATASET_SELECTION_BITS为NVRAM管理器配置编码该信息的位数。
例子:数据集信息被配置为在16位块号的四个LSB中编码(每个NVRAM块最多允许16个数据集,总共允许4094个NVRAM块)。实现者决定将NVRAM块的所有数据集直接相邻存储,并使用块的长度和指针访问每个数据集。为了计算块的起始地址(第一个数据集的地址),她/他只使用12个MSB,为了访问特定的数据集,她/他将块的大小乘以数据集索引(4个MSB)添加到这个起始地址(如下图).
3.3、翻页(页切换)机制
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。
3.4、Fee初始化地址
Fee 提供地址管理机制,Fee 会在Ram中实施记录所有Block的当前地址和状态,在Block写入新的数据时,又会更新这个地址。
这些地址主要用于Fee读取Block数据。
在Fee进行初始化之前,这些Block地址是未知的,因此需要在Fee 初始化阶段,需要从Flash 遍历得到当前Blcok的地址。
4、英飞凌FEE实现解析
双扇区算法必须使用所有逻辑扇区循环,以防止在静态扇区中擦除干扰的积累。选择相同扇区大小例如TC27x: 192 kByte扇区大小(24个逻辑扇区)
4.1、初始状态页面布局
GC: Garbage Collection
执行状态机如下
4.2、状态页格式
注意上面章节的状态页信息,状态页里面具体描述了什么信息呢?如下图。
注意最上面的B0….B7代表Bytes0 到Bytes7
具体点描述如下:
5、ISOLAR-AB配置FEE
由于FEE类似于每个芯片厂商的定制类型了,所以各家的配置也有区别,例如项目里面使用的ETAS的工具,实现FEE配置如下。
FeeGeneral
FeeNvmJobEndNotification: 映射到上层模块(NvM_JobEndNotification)提供的作业结束通知例程。这个标签目前没有效果。如果需要,作业结束和作业错误通知必须按块配置。这个因为无效所以图里面写的函数是错的,实际应该是API: NvM_JobEndNotification
FeePollingMode: 预处理器开关以启用和禁用此模块的轮询模式(作业结果功能的使用)。
FeeRbConfirmSingleStorageBlockloss: 如果选择FS1或FS2作为文件系统:即使在常规操作期间,配置为单个存储的块丢失的概率也非常低。背景:如果在对块的最后一页的单元进行物理充电时发生中断(复位或断电),则可以将数据保留弱编程并在以后的操作中丢失。由于这个原因,建议将关键数据配置为双存储。欲了解更多信息,请查看rba FeeFs1和/或rba FeeFs2文档第10章"Miscellaneous"。通过将此标记设置为true,您确认在块配置中考虑了该弱点。如果不这样做,构建将中止。这样做是由于质量度量,以确保有关该信息的知识在组织中传播。
FeeRbFsSelect: 指定flash中数据的实际布局。
FeeRbMachineType: 无MCU模块时需要配置的控制器类型
FeeVirtualPageSize:虚拟页大小。
FlsRbPageSize:引用的Flash页大小。
FlsRbErasedValue:该参数定义Data Flash的擦除值(HW/target相关配置),这个参数其实无所谓,因为默认值一般是MCU定的。
FeeRbSector:Fee的Block大小,一般设置为DFLASH的一半,毕竟最小两个Block给NCM使用。