【Memory协议栈】EEPROM Abstraction模块详细介绍

目录

前言

正文

1.功能简介

2.关键概念

3.功能详解

3.1 Addressing scheme and segmentation

3.2 Address calculation

3.3 Limitation of erase / write cycles

3.4 Handling of “immediate” data

3.5 Managing block consistency information

4.关键API定义

4.1 Ea_Init

4.2 Ea_SetMode

4.3 Ea_Read

4.4 Ea_Write

4.5 Ea_Cancel

4.6 Ea_GetStatus

4.7 Ea_GetJobResult

4.8 Ea_InvalidateBlock

4.9 Ea_EraseImmediateBlock

4.10 Ea_JobEndNotification

6.依赖的接口

6.1 强制性接口

6.2 可配置接口


前言

存储协议栈负责ECU中非易失性数据的存储管理。存储协议栈的分享包括NVM、MemI、Ea、Fea、Eep、Fls模块的详细介绍及代码分析,具体的项目实战请关注本号的后续文章,本篇为EEPROM Abstraction(Ea)模块详细介绍篇。

正文

1.功能简介

MemIf模提供统一的接口让NVRAM管理器访问几个内存抽象模块(FEE或EA模块)。

图1:存储协议栈分层架构

EEPROM抽象(EA)从设备特定的寻址方案和分割中提取,并为上层提供了一个虚拟的寻址方案和分割,以及“虚拟”无限数量的擦除周期。

2.关键概念

NVRAM:Non-volatile RAM (Random Access Memory),非易失性RAM(随机存取存储器)

NvM: NVRAM Manager

(Logical) block:逻辑块,由模块用户所看到的最小的可写/可擦除的单元。由一个或多个虚拟页面组成。

Virtual page:虚拟页,可以包含一个或几个物理页面,以方便处理逻辑块和地址计算。

Internal residue:如果配置的块大小不是虚拟页面大小的整数倍,则在最后一个虚拟页面末尾的未使用空间。

Virtual address:虚拟地址,由逻辑块内的16位块号和16位偏移量组成。

Physical address:物理地址,用于访问逻辑块的设备特定格式(取决于底层EEPROM驱动程序和设备)的地址信息。

Dataset:NVRAM Manager中的概念:一个用户可寻址的相同大小的块数组。例如,Dataset可用于为CAN驱动程序提供不同的配置设置(CANid,过滤器设置,……),而ECU具有相同的应用软件(例如车门控制模块)。

Redundant copy:NVRAM Manager中的概念:存储两次,以提高数据存储的可靠性。

3.功能详解

EEPROM抽象(EA)一次只能接受一个作业,即该模块不能为挂起的作业提供一个队列(这是NVRAM Manager实现的功能。

注意:由于NvM是该模块的唯一调用者,为了保持该模块相当小,模块功能不能检查模块当前是否忙。NvM有责任序列化挂起的作业,并且只有在前一个作业完成或取消后才启动一个新作业。

3.1 Addressing scheme and segmentation

EEPROM抽象(EA)模块为上层提供了一个32位的虚拟线性地址空间和均匀的分割方案。这个虚拟的32位地址是由以下两部分组成:

. 16位块号(block number)-允许(理论)最大65536个逻辑块

. 16位块偏移(block offset)-允许(理论上)最大每个块64k字节的块大小

16位块号表示一种可配置的(虚拟)分页机制。这个地址对齐的值可以从底层的EEPROM驱动程序和设备的值中得到。这个虚拟分页可以通过参数EA_VIRTUAL_PAGE_SIZE进行配置。

Ea模块的配置应使虚拟页面大小(在EA_VIRTUAL_PAGE_SIZE中定义)为物理页面大小的整数倍,即不允许配置比实际物理页面大小更小的虚拟页面。

示例:虚拟页面的大小被配置为8个字节,因此地址对齐方式为8个字节。块号为1的逻辑块被放置在物理地址x处。块号为2的逻辑块将被放置在x+8,块号为3将被放置在x+16。

注意:要求允许计算逻辑块的物理开始地址,而不是为地址映射创建必要的查找表。

每个已配置的逻辑块应占已配置的虚拟页面大小的整数倍(配置参数EA_VIRTUAL_PAGE_SIZE)。

例如:如果虚拟页面的大小被配置为8个字节,那么逻辑块的大小可以是8、16、24、32、……字节,但不是,例如10、20、50、……字节。

逻辑块不能相互重叠,也不能相互包含在一起。

示例:通过相应地设置参数EA_VIRTUAL_PAGE_SIZE,将地址对齐/虚拟分页配置为8个字节。逻辑块号1被配置为32字节大小(参见图3)。这个逻辑块将恰好使用4个虚拟页面。因此,下一个逻辑块将获得块号5,因为块号2、3和4被第一个逻辑块“阻塞”。第二个块被配置为100字节大小,占用13个虚拟页面,最后一页的4个字节未使用。因此,下一个可用的逻辑块号将是17。

图2:虚拟 vs 物理内存布局

不能为逻辑块配置块号0x0000和0x FFFF。

问题:图二中的logic block number为啥不是1,2,3而是1,5,17,每一个page要暂用一个logic number?

3.2 Address calculation

根据EA模块的实现和所使用的确切地址格式,EA模块的功能应结合16位块数和16位块偏移量,以推导出底层EEPROM驱动程序所需的物理EEPROM地址。

注意:底层EEPROM驱动程序所需的确切地址格式取决于具体的EEPROM地址访问格式,因此如何从给定的16位块数和16位块偏移量获得物理EEPROM地址取决于EEPROM设备和EEPROM设备驱动程序的实现

只有16位块号中不表示特定数据集或冗余副本的位才能用于地址计算。由于NVRAM Manager需要DataSet信息,所以可以使用参数NVM_DATASET_SELECTION_BITS为NVRAM Manager配置要编码DataSet的位数。

示例:数据集信息被配置为编码在16位块号的4个LSB中(允许每个NVRAM块最多16个数据集和总共4094个NVRAM块)。实现者决定存储一个直接相邻的逻辑块的所有数据集,并使用该块的长度和一个指针来访问每个数据集。为了计算块的起始地址(第一个数据集的地址),她/他只使用12个MSB来访问一个特定的数据集,她/他将块的大小乘以数据集索引(四个MSB)添加到这个起始地址。

图3:Block Number和DataSet Index关系

3.3 Limitation of erase / write cycles

Ea模块的配置,应该通过EaNumberOfWriteCycles配置参数配置每一个逻块的预期读写周期。

如果底层EEPROM设备或设备驱动程序不提供每个物理存储单元至少配置的擦/写周期数(通过EepAllowedWriteCycles配置参数),EA模块应提供扩展的擦/写访问的机制,使物理设备不会超过物理读写寿命。这也应适用于EA模块内部使用的所有管理数据。

示例:逻辑块号1被配置为预期的500.000个写入周期,底层的EEPROM设备和设备驱动程序仅被指定为100.000个擦除周期。在这种情况下,EA模块必须提供(至少)5个独立的存储器区域,并在内部交替进行这些区域之间的访问,以便每个物理存储器位置只在指定的100.000个周期内被擦除。

3.4 Handling of “immediate” data

包含即时数据的块必须即时写入,即这些块应无需必要就可写入,以便首先擦除相应的存储器区域(例如,通过使用预擦除的存储器)。在写入即时数据之前,NVRAM经理应取消持续的较低优先级的读取/擦除/写入或比较作业。

注意:硬件上正在运行的操作(例如写入一个页面或擦除一个扇区)通常不能在启动后中止。因此,即使对于即时数据,最长的硬件操作的最大时间也必须被接受为延迟

示例:三个10字节的块已经配置为即时数据。EA模块/配置工具保留这30个字节(如果需要,外加每块/页面的实现特定开销),仅供此即时数据使用。即该存储区不得用于存储其他数据块。现在,NVRAM管理器已经请求EA模块编写一个100字节的数据块。在写入此块时,会出现需要写入一个(或多个)直接数据块的情况。因此,NVRAM管理器取消了正在进行的写请求,并随后对包含即时数据的(第一)块发出写请求。正在进行的写请求的取消由EA模块同步执行,并且作为对即时数据的写请求的底层EEPROM驱动程序可以被启动,而没有任何进一步的延迟。然而,在可以写入即时数据的第一个字节之前,EA模块分别的底层EEPROM驱动程序必须等待来自前一个写请求的持续硬件访问的结束(例如,写入页面、擦除扇区、通过SPI传输、……)。

3.5 Managing block consistency information

Ea模块应管理每个模块的信息,无论该模块是否“正确”。此一致性信息应只涉及块的内部处理,而不涉及块的内容。

当一个块写操作启动时,EA模块会将对应的块标记为不一致(这并不一定意味着在物理设备上进行写操作。如果有其他方法检测逻辑块的一致性,则应避免更改与该逻辑块存储的管理信息)。在块写操作成功结束后,EA模块将(再次)将块标记为一致。

注意:此内部管理信息不应与块的可通过使用Ea_InvalidateBlock服务进行操作的有效性信息混淆,即EA模块应能够区分不一致的块和被上层故意失效的块

4.关键API定义

4.1 Ea_Init

void Ea_Init(const Ea_ConfigType* ConfigPtr)

初始化EEPROM抽象模块。Ea_Init在初始化模块后将模块状态从MEMIF_UNINIT设置为MEMIF_BUSY_INTERNAL,如果初始化在Ea_Init内完成,则在初始化成功完成后,功能Ea_Init应将模块状态从MEMIF_BUSY_INTERNAL设置为MEMIF_IDLE。

4.2 Ea_SetMode

 void Ea_SetMode(MemIf_ModeType Mode)

通过此功能来切换底层EEPROM驱动程序的模式。功能Ea_SetMode应检查模块状态是否为MEMIF_BUSY。如果是这种情况,函数Ea_SetMode将提高运行时错误EA_E_BUSY并返回给调用者,而不执行模式开关。Ea_SetMode应检查模块状态是为MEMIF_IDLE还是MEMIF_BUSY_INTERNAL。如果是这种情况,模块应接受模式更改请求。当模块完成内部管理操作后,应在模块的主功能中异步执行模式变更。

4.3 Ea_Read

Std_ReturnType Ea_Read(uint16 BlockNumber,uint16 BlockOffset,uint8* DataBufferPtr,uint16 Length)

从块号为BlockNumber且块内地址偏移为BlockOffset地址处读取数据大小为Length自己的疏导到DataBufferPtr缓冲处。

函数Ea_Read应取块号和偏移量,并计算相应的内存读取地址。

注意:地址偏移量和长度参数可以取给定类型范围内的任何值,这允许从逻辑块内的任意地址读取任意数量的字节。

EA模块应在EA模块的主要功能范围内异步执行读取操作。

4.4 Ea_Write

Std_ReturnType Ea_Write(uint16 BlockNumber,const uint8* DataBufferPtr)

将DataBufferPtr缓冲中的数据写入DataBufferPtr中。

函数Ea_Write应取块号,并计算相应的内存写地址。此地址计算的块偏移量应固定为零。

函数Ea_Write应将写入Job的长度参数设置为为此逻辑块配置的长度。

4.5 Ea_Cancel

void Ea_Cancel(void)

取消正在进行的异步操作。

注意:Ea_Cancel函数和底层EEPROM驱动的cancel函数是同步的,即它们的工作一旦返回到调用者就完成了。另一方面,在EEPROM内存中进行正在进行的读、擦除或写作业是异步的Cancel函数只能重置其模块内部变量,以便模块能够接受新的作业。它们不会取消硬件中正在进行的作业,也不会等待硬件完成正在进行的作业。这可能会导致这样的情况:模块的状态报告为IDLE,而硬件仍然在执行一个正在进行的作业。因此,EEPROM驱动程序的主要功能应该在开始新的工作之前检查硬件是否空闲

注意:如果必须写入更高优先级的数据(即即时数据),则只能使用Ea_Cancel来中止NV块的读写请求。

4.6 Ea_GetStatus

MemIf_StatusType Ea_GetStatus(void)

返回Ea模块的状态。

MEMIF_UNINIT:EA模块尚未初始化(尚未)。

MEMIF_IDLE:EA模块当前处于空闲状态。

MEMIF_BUSY:EA模块当前正忙。

MEMIF_BUSY_INTERNAL:EA模块目前正忙于进行内部管理操作。

4.7 Ea_GetJobResult

MemIf_JobResultType Ea_GetJobResult(void)

函数Ea_GetJobResult应返回NVRAM Manger请求的最后一个作业的状态。只有那些由上层直接请求的Job才会对函数Ea_GetJobResult返回的作业结果产生影响。即EA模块本身在内部管理操作过程中发放的作业,不得改变作业结果。

注意:为了便于实现这一点,EA模块可能必须实现第二组本地变量来存储内部作业的数据。

注意:内部管理操作(例如,“垃圾收集”)将仅在从NvM请求的作业的上下文中被调用。它们是必须在请求的作业之前还是之后完成,这是模块实现者的决定。

MEMIF_JOB_OK:最后一个作业已成功完成。

MEMIF_JOB_PENDING:最后一个作业正在等待执行或当前正在执行。

MEMIF_JOB_CANCELED:上一个作业已被取消(这意味着它已失败)。

MEMIF_JOB_FAILED:最后一个作业未成功完成(它失败了)。

MEMIF_BLOCK_INCONSISTENT:所请求的块不一致,它可能包含已损坏的数据。

MEMIF_BLOCK_INVALID:请求的块已无效,无法执行请求的操作。

4.8 Ea_InvalidateBlock

Std_ReturnType Ea_InvalidateBlock(uint16 BlockNumber)

使BlockNumber标识的块无效。

根据实现的不同,Ea_InvalidateBlock应通过调用底层设备驱动程序的擦除函数或相应地更改一些模块内部管理信息来使块无效。

注意:请求的块的失效方式取决于模块的具体实现。内部管理信息必须存储在NV存储器中,因为它必须在软件重启或冷启动后仍保存历史状态信息。这些信息是什么以及它是如何存储的,取决于模块具体实现。

4.9 Ea_EraseImmediateBlock

Std_ReturnType Ea_EraseImmediateBlock(uint16 BlockNumber)

擦除BlockNumber标识的块。

函数Ea_EraseImmediateBlock取块号,计算相应的内存块地址。此地址计算的块偏移量应固定为零。

Ea_EraseImmediateBlock函数应确保EA模块能够立即写入数据。这是否涉及物理擦除内存区域,并因此调用底层驱动程序的擦除函数,取决于实现。

1.回调函数

Ea模块提供Call Back函数给下层Eep模块调用。

注意:根据组成NV内存栈的模块的实现,EA模块提供的回调例程可能会在中断级被调用。因此,EA模块的实现必须确保这些例程的运行时间相当短,例如,因为回调可能会通过几个软件层向上传播。在中断级别上是否允许/可行回调例程取决于项目特定的需求(反应时间)和限制(在中断环境下运行)。因此,系统设计必须确保所涉及的模块的配置符合这些要求。

4.10 Ea_JobEndNotification

void Ea_JobEndNotification(void)

底层的EEPROM驱动程序应调用函数Ea_JobEndNotification来报告异步操作的成功结束。

6.依赖的接口

6.1 强制性接口

6.2 可配置接口

void NvM_JobEndNotification(void)

底层内存抽象使用该函数表示作业结束,没有错误。在执行所有必要的内部管理操作后,Ea模块应调用配置参数EaNvMJobEnd通知中定义的函数。成功结束异步读操作意味着读作业已完成,结果正常。

在完成所有必要的内部管理操作后,当异步写操作成功结束时,Ea模块将调用配置参数EaNvMJobEndNotification中定义的函数。异步写操作成功结束意味着写作业结束,结果是OK的,并且块已经被标记为有效。

void NvM_JobErrorNotification(void)

在执行所有必要的内部管理和错误处理操作后,Ea模块应调用配置参数EaNvMJobError通知中定义的函数。异步读操作失败意味着读作业已完成并已失败。

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Autosar提供了许多服务和接口,以帮助开发人员在汽车电子系统中实现模块化和可重用的软件组件,下面是对每个服务的详细介绍: 1. System Services:系统服务提供了访问系统资源的接口,例如定时器、中断控制器、系统时钟等。它还提供了一些基本的系统功能,例如调度器、错误处理、事件记录等。 2. Memory Services:内存服务提供了一种方法,以帮助开发人员管理汽车电子系统中的内存资源。它提供了一组标准的内存管理功能,例如内存分配、内存释放、内存保护等。 3. Communication Services:通信服务提供了一种方法,以帮助开发人员管理汽车电子系统中的通信资源。它提供了一组标准的通信管理功能,例如消息传递、消息过滤、网络管理等。 4. Onboard Device Abstraction:Onboard Device Abstraction(ODA)提供了一种方法,以帮助开发人员管理汽车电子系统中的设备资源。它提供了一组标准的设备管理功能,例如设备初始化、设备配置、设备控制等。 5. Memory Hardware AbstractionMemory Hardware Abstraction(MHA)提供了一种方法,以帮助开发人员管理汽车电子系统中的内存硬件资源。它提供了一组标准的内存硬件管理功能,例如内存映射、内存保护、内存访问等。 6. Communication Hardware Abstraction:Communication Hardware Abstraction(CHA)提供了一种方法,以帮助开发人员管理汽车电子系统中的通信硬件资源。它提供了一组标准的通信硬件管理功能,例如网络配置、网络管理、消息传递等。 7. Microcontroller Drivers:微控制器驱动程序提供了一组标准的接口,以帮助开发人员管理汽车电子系统中的微控制器资源。它提供了一组标准的微控制器管理功能,例如中断控制、定时器控制、GPIO控制等。 8. Memory Drivers:内存驱动程序提供了一组标准的接口,以帮助开发人员管理汽车电子系统中的内存资源。它提供了一组标准的内存管理功能,例如内存映射、内存保护、内存访问等。 9. Communication Drivers:通信驱动程序提供了一组标准的接口,以帮助开发人员管理汽车电子系统中的通信资源。它提供了一组标准的通信管理功能,例如网络配置、网络管理、消息传递等。 10. I/O Drivers:I/O驱动程序提供了一组标准的接口,以帮助开发人员管理汽车电子系统中的输入/输出资源。它提供了一组标准的I/O管理功能,例如GPIO控制、UART控制、SPI控制等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汽车电子嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值