【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通知中定义的函数。异步读操作失败意味着读作业已完成并已失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习磁盘管理

文章目录 一、磁盘接口类型二、磁盘设备的命名三、fdisk分区四、自动挂载五、扩容swap六、GPT分区七、逻辑卷管理八、磁盘配额九、RAID十、软硬链接 一、磁盘接口类型 IDE、SATA、SCSI、SAS、FC(光纤通道) IDE, 该接口是并口。SATA, 该接口是串口。SCS…

golang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

websocket入门及应用

websocket When to use a HTTP call instead of a WebSocket (or HTTP 2.0) WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。WebSocket 是双向通讯,有状态,客户端一(多)个与服务端一(多&#xff09…

代码随想录刷题第43天

第一题是最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/,没啥思路,直接上题解了。本题可以看作将一堆石头尽可能分成两份重量相似的石头,于是问题转化为如何合理取石头,使其装满容量为石头总重量一半的…

【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑

之前跟着《MetaGPT智能体开发入门课程》学了一些MetaGPT的知识和实践,主要关注在MetaGPT入门和单智能体部分(系列文章附在文末,感兴趣的可以看下)。现在新的教程来了,新教程主要关注多智能体部分。 本系列文章跟随《M…

Wagtail安装运行并结合内网穿透实现公网访问本地网站界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&#xf…

C++Lambda表达式介绍

C11中引入了Lambda表达式,Lambda表达式是一种匿名函数,它可以在需要函数的地方直接定义和使用,而无需显式地定义一个函数。 lambda表达式 Lambda表达式语法定义 [capture-list](parameters) -> return-type { statement } capture-lis…

SQL Developer 小贴士:PL/SQL语法分析

对于SQL或PL/SQL中的语法错误和警告,SQL Developer可以用不同颜色的下划波浪线显示。 启用语法分析,可以用菜单Tool>Preferences>Code Editor>Completion Insight>Enable Semantic Analysis Info Tips 例如,以下的代码中&…

blender bvh显示关节名称

导入bvh,菜单选择布局,右边出现属性窗口, 在下图红色框依次点击选中,就可以查看bvh关节名称了。

自考《计算机网络原理》考前冲刺

常考选择填空 1、计算机网络的定义:计算机网络是互连的、自治的计算机的集合。 2、协议的定义:协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定 3、协议的3个要素 (1) 语法:定义实体之间交换信息的格式与结构,或…

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。 策略模式的角色: 策略接口角色IStrategy:用来约束一系列具体…

第一次开机开机动画结束后闪白屏

开机动画结束会闪下白屏,再进入launcher 思路 : 分析下从开机动画结束到launcher起来之间的流程步骤 从ZygoteInit.java开始分析 : SystemServer起来后会启动一些核心服务 attachApplication方法中主要创建了Application和Activity 接下里RootActivityC…

快速搭建网站原型!8款网站原型软件推荐

现在,基于云的软件已经逐渐成为主流,网站原型设计工具也不例外。与桌面版本相比,在线原型工具具有独特的优势,无论您使用Linux,Mac 或者Windows,都不需要安装就可以使用这些工具。下面小编就为大家推荐8款非…

c++入门学习⑧——模板

目录 前言 基本介绍 什么是模板? 作用 特点 分类 函数模板 语法 使用方式 注意事项 函数模板和普通函数区别 普通函数和函数模板的调用规则 局限性 类模板 语法 类模板的成员函数创建时机 类模板实例化对象 类模板实例化对象做函数参数 类模板成…

普中51单片机学习(LCD1602)

LCD1602 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔&#…

代码随想录算法训练营29期|day60 任务以及具体安排

第九章 动态规划part17 647. 回文子串 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < le…

C++ 高频考点

1. C/C内存有哪几种类型&#xff1f; C中&#xff0c;内存分为5个区&#xff1a;堆(malloc)、栈(如局部变量、函数参数)、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#xff09;和常量存储区&#xff08;常量&…

YOLOv9来了!实时目标检测新SOTA

先上一把网上的测试效果对比: YOLOv9架构图 速度论文 代码&#xff1a;GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 论文&#xff1a;[2402.13616] YOLOv9: Learning What You…

HTTP/HTTPS协议

什么是HTTP协议 HTTP被称为超文本传输协议(里面不仅仅可以是字符串,还可以是图片,特殊字符等),这是一种应用非常广泛的应用层协议. HTTP协议诞生于1991年,现在是最主流使用的一种应用层协议.它从诞生到现在为止迭代了多个版本. 但目前最主流使用的还是HTTP1.1和HTTP2.0. HTTP协…