[AutoSar]BSW_Memory_Stack_007 FEE 模块介绍


  

关键词

嵌入式、C语言、autosar、OS、BSW

平台说明

项目Value
OSautosar OS
autosar厂商vector , EB
芯片厂商TI 英飞凌
编程语言C,C++
编译器HighTec (GCC)
autosar版本4.3.1
参考文档TechnicalReference_Fee.pdf AUTOSAR_SWS_FlashEEPROMEmulation.pdf

在这里插入图片描述
  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  
  

缩写描述
EEPROMElectrically Erasable Programmable read only memory
NVMNVRAM Manager
MEMIFMemory Abstraction Interface
EAEEPROM Abstraction
EEPinternal/external EEPROM DRIVER
FEEFlash EEPROM Emulation
FLSinternal/external Flash Driver
FCFSFirst come first served
LUTLook Up Table
CHchunk header
CIchunk instance
CLchunk link

一、FEE所处架构位置

  FEE 处于ECU 抽象层。
在这里插入图片描述
在这里插入图片描述

二、FEE 功能描述

   由于EEPROM 太贵,出于成本考虑,于是有了FEE (Flash EEPROM Emulation)。虽然用DFLASH Emulation 的EEPROM 擦除次数远不及真实的EEPROM ,但是我们可以通过顺序写入和换页的机制来平衡整个DFALSH 的寿命。下述为vector为FEE做的实现的功能:

  • 1.为NVM 提供操作。
  • 2.硬件限制,如周期擦除或扇区大小是抽象的,对上层是不可见的。
  • 3.检查未完成的写入操作。
  • 4.提供虚拟扇区使用wrap-around的概念,备份最近的数据块。
  • 5.检索逻辑扇区的擦除周期数的可行性(通过API服务完成)Fee_GetEraseCycle())
  • 6.检索块的写周期数的可行性(通过API服务完成)Fee_GetWriteCycle)
  • 7.强制扇区切换的可行性(通过API服务完成)Fee_ForceSectorSwitch())。
  • 8.在配置更新后执行数据转换的API,即有效载荷发生变化的块可以根据新的配置进行转换,而不会丢失数据。
  • 9.Fee支持高达2gb字节的Flash地址空间(由Fls提供),即Fee使用的扇区可能在0x00000000到0x7FFFFFFF范围内。
  • 10.Fee_MainFunction触发:可以在循环任务或后台任务中调用Fee_MainFunction。
  • 11.将多个logical sector 合并为一个physical sector,FEE 一般同时操作两个logical sector
  • 12.冗余内部信息关联,增强其鲁棒性。
  • 13.在FBL 和APP 间共享 配置信息。

2.1 Initialization

  FEE通过调用Fee_Init() 或者 Fee_InitEx()完成初始化。
  FEE初始化只是让FEE准备好接受和处理请求。当分区上启动第一个请求后,扇区再初始化(检查它们的头并确定用新的还是旧的section)。
  不建议在ECU 的启动阶段过早的对NV block 进行操作。
在这里插入图片描述

2.2 Flash organization

   在这里我们要弄懂这几个概念:(User) Blocks,FEE block 、Partitions 、Logical Sectors、Physical Sector和Block chunk 的概念。
下图为他们的大概关联。
在这里插入图片描述

在这里插入图片描述

2.2.1 (User) Blocks

  指在NVM 模块中使用到的NVRAM block,具体参照[AutoSar]NVM模块介绍和使用说明,其中的NV block 由CRC+Data 组成。

2.2.2 FEE block

  映射自NVRAM blcok,指需要在抽象层中需要指定多大的FLASH 。
在这里插入图片描述

2.2.3 Partitions

在这里插入图片描述
  Partitions,翻译为分区,是FEE 中的概念,与ECUC 中的 的partitons 配合使用,见第二节[AutoSar]BSW_ OS CORE, Physical core,EcuC core,EcuC partition,OSApplication的关系
  FEE Partitions 作为一个单独的虚拟内存分区,与其他虚拟内存分区独立。一个工程中可以包含多个Partitions ,具体设计后续单独讲。 链接预留Partitions 有如下特性:

    1. Partitions 中产生的 Errors 不会影响到其他的Partitions 。
    1. 每个Partitions 至少拥有两个logical sectors,同理,每个logical sectors 都必须assign到 一个partitions。
    1. 在同一时刻只能允许一个Partitions 进行 sector switch (翻页操作)。
    1. 如果FBL 和APP 想要共享分区必须引用相同的Fls配置(FlsConfigSet容器),并且它们必须在地址和大小以及对齐设置上匹配。
    1. 分区设计必须考虑数据的使用频率和整体性能(例如寻址时间和翻页时间长短),后续单独讲链接预留

2.2.4 Chunks

在这里插入图片描述

  Chunk 是FEE block 中的一个配置属性。Chunk 是FEE可以在Flash中动态分配的最小实体。chunk的大小决定了FEE block 在FLASH 中的空间大小。如下图所示chunk =3 ,FEE会按照顺序先写入1,2,3.当写满的时候会通过CL(chunk link )链接到下一个新的chunk 4,直到它被填满,以此类推直到logical sector 写满后翻页。

在这里插入图片描述

  一般来说,chunk 的大小(N = 2n-1)需要考虑该fee block 的写入频率。如果频率高,那么chunk 的值需要配置大一些,反之如果频率不高则配置小一些,但是至少为1。这是因为每次chun满了之后会创建一个链表,链接到下一个chunk,当FEE 通过搜索链表查找该用那个chun的时候。如果创建的链表太多,会导致平均搜索时间增加,这又是因为FEE 的job 是异步操作的,每搜索一个链表节点都会需要额外的Fee_MainFunction和Fls_MainFunction循环。
  在vector配置中,chunk 的配置值必须为N = 2n-1,因为在搜索链表的时候采用的是二分法。

2.2.5 Logical Sectors

   FEE将分配给分Partitions的physical flash 分成两部分,称为Logical Sectors。每个逻辑扇区必须映射到一个或多个连续的physical Flash sector。Logical Sectors不需要在physical sector界上对齐,即它们可以在physical sector内开始和/或结束。但是,起始地址和结束地址必须遵循配置的地址对齐方式。

2.2.6 physical flash

   与其他内存区域间的物理隔离,只要该BANK没用到,物理存储丢了也没啥事。一个Physical Sectors 包含(mapping关系)了多个Logical Sectors。

2.2.7 FEE block 和NVRAM block 的关联

   FEE block 其实就是在NVRAM block 的基础上添加FEE header information 、hunks和CL
在这里插入图片描述

   以2.2.2 节为例,data size = 2byte,chunk = 2,crc16 = 2byte,dflash page size = 8byte。chunk head = 16byte
chunk link = 8byte.
在这里插入图片描述
在这里插入图片描述

2.3 顺序写入

   如2.2.4 所讲,chunk 通过链表的方式依次写入logical sector,写入新的chunk 的同时使原来的chunk 失效,这就是所谓的顺序写入。这样做的好处就是可以平均消耗flash 的寿命。
   如下图所示:FEE_UB1 chunk = 3,依次写入UB1.
在这里插入图片描述

2.4 翻页

   [AutoSar]BSW_Memory_Stack_008 FEE 的sector switch (翻页)

2.5 Processing

   在FEE 中,所有的 job 包含Read, Write, InvalidateBlock, EraseImmediateBlock, GetWriteCycle,
GetEraseCycle, ForceSectorSwitch 都是在状态机的帮助下异步执行的。状态机如下图所示:

    1. 一次只能接受一个job。因此,只要当前pending的job尚未完成,就不允许向FEE请求新的job。
    1. 当一个internal操作正在进行的时候,状态为MEMIF_BUSY_INTERNAL,这时候一个job也可以被接受。
    1. 只有初始化后才能使用状态机处理。
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

2.5.1 Initial processing

  初始化阶段FEE会判定那个sector 是active 的,哪一个是包含了最新的数据,确定后拷贝到RAM 中。
  FEE尝试读取两个扇区头,即每个逻辑扇区的前8个字节。这个处理至少需要3个周期(从初始作业请求到实际作业处理的开始),假设FEE不需要等待Fls,即在两次Fee_MainFunction调用之间完成Fls_Read处理。
  如果两个logical sector 中一个header损坏另一header个完好,则会选用完好那个sector并擦除坏的那个。如果两个sector header 没坏,但是被擦除了,则会当作这两个sector 都是满的,这时候会擦除一个sector header并写入headerinformation。如果两个sector 的header 都是损坏了,则回调callback function(需配置)。

在这里插入图片描述

2.5.2 Processing of Read Job

  FEE 提供Fee_Read() API 读取最新写入block 的数据,这个API 是异步操作,通过Fee_MainFunction() 执行。
  在非常罕见的情况下,Fee_Read()可能会传递旧数据,即不是最近写入的实例。如果最近的实例损坏(例如,由于reset),FEE尝试找到前身实例并交付其数据。即使在这种情况下,FEE也会报告MEMIF_JOB_OK。应用程序必须处理无法获得最新写入数据的可能性。

2.5.3 Processing of Write Job

  FEE 提供Fee_Write() API,通过 Fee_MainFunction() 异步调用此API 将值写入最近的空闲chunk 中。

2.5.4 Processing of InvalidateBlock Job

  FEE 使用API函数Fee_InvalidateBlock()使闪存中的块内容无效。FEE组件将块标记为无效;读取成功后,后续的读取尝试报告MEMIF_BLOCK_INVALID.实际原理就是写入一个新的instance,也会消耗flash。

2.5.4 Processing of EraseImmediateBlock Job

  擦除周期计数器在某个逻辑扇区的每次擦除期间增加,并因此计数闪存的擦除周期。要获取指定逻辑扇区的擦除周期计数器,可以使用API函数Fee_GetEraseCycle()。此服务的可用性可以在预编译时通过配置工具进行配置。这个异步作业由API函数Fee_GetEraseCycle()发起,并由后续的Fee_MainFunction()调用处理。

2.5.5 Processing of GetWriteCycle Job

  写周期计数器统计每个块的写周期。要获取指定块的写周期计数器,可以使用API函数Fee_GetWriteCycle()。此服务的可用性可以在预编译时通过配置工具进行配置。此异步作业由API函数Fee_GetWriteCycle()启动,并由后续的Fee_MainFunction()调用进行处理。

2.6 Fee_MainFunction Triggering

  在autosar 4.0版本后,OS可以在周期task或者背景task 中调用Fee_MainFunction,但是如果我们想更快的执行FEE 的异步服务,可以在CUP 空闲的时候背景调用Fee_MainFunction,但是必须保证Fee_MainFunction 在Fls_MainFunction之后调用,因为Fee_MainFunction 必须等待Fls_MainFunction执行完成。

2.7 Look Up Table

在这里插入图片描述
  FEE在RAM中提供了一个Look Up Table(LUT)来改进对块的最新数据的搜索。这是通过在RAM中保存每个chunk的最新地址来实现的,因此FEE可以节省一些FLS访问,从而提高每个job的性能。在每次chunk 更新的时候LUT也更新其入口地址。
  为了额外支持启动过程(即NvM_ReadAll), RAM中的LUT需要包含合理的数据,这需要在RAM中初始化LUT。为此目的,FEE在配置时自动在NV RAM中创建LUT,即所谓的LUT block。在ECU关闭之前,将RAM LUT的内容保存到NV RAM对应。在ECU启动的初始化阶段,FEE读取NV RAM中的LUT内容并将其复制到RAM中。这使得在NvM_ReadAll作业期间已经可以使用LUT信息。
  启用LUT 消耗额外的RAM 和NV RAM ,所以是否开启关键在于这个chunk是否需要在系统启动的第一时间就被用到,例如一些关键标定数据(预驱芯片控制,电机控制,上电自检时间缩减)。
  在Flash引导加载程序配置中不支持LUT功能。

  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  • 32
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老灰╮(╯-╰)╭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值