目录
前言
正文
1.功能简介
2.关键概念
3.关键类型定义
3.1 MemIf_StatusType
3.2 MemIf_JobResultType
3.3 MemIf_ModeType
4.关键API定义
4.1 MemIf_SetMode
4.2 MemIf_Read
4.3 MemIf_Write
4.4 MemIf_Cancel
4.5 MemIf_GetStatus
4.6 MemIf_GetJobResult
4.7 MemIf_InvalidateBlock
4.8 MemIf_EraseImmediateBlock
4.9 MemIf_EraseImmediateBlock
5.依赖的接口
6.小结
前言
存储协议栈负责ECU中非易失性数据的存储管理。存储协议栈的分享包括NVM、MemI、Ea、Fea、Eep、Fls模块的详细介绍及代码分析,具体的项目实战请关注本号的后续文章,本篇为Memory Abstraction Interface(MemIf)模块详细介绍篇。
正文
1.功能简介
MemIf模提供统一的接口让NVRAM管理器访问几个内存抽象模块(FEE或EA模块)。
内存抽象接口(MemIf)应从底层FEE或EA模块的数量中抽象,并在统一的线性地址空间上提供虚拟分割。
2.关键概念
Fast Mode: 例如,在启动/关闭期间,底层驱动程序可以被切换到快速模式,以便在这些阶段允许快速读/写。
Slow Mode: 在正常操作期间,底层驱动程序可以以慢速模式使用,以减少在底层设备/通信媒体的运行时或阻塞时间方面的资源使用。
注意:Fast Mode和Slow Mode可能取决于驱动程序的实现和底层设备的功能。也可能取决于NVRAM Manage的配置,因此也取决于特定项目的需求。
3.关键类型定义
3.1 MemIf_StatusType
MemIf_StatusType类型标示底层抽象模块和设备驱动器的当前状表态。
3.2 MemIf_JobResultType
MemIf_JobResultType表示上一个作业的结果。
3.3 MemIf_ModeType
MemIf_ModeType表示底层抽象模块和设备驱动程序的操作模式。
4.关键API定义
MemIf模块没有自己内部的功能逻辑,所有的API接口都会直接映射到对应的底层抽象模块(Ea, FEE)的API。
如果只配置了一个内存抽象模块,则内存抽象接口应实现为一组宏,将内存抽象接口API映射到相应的内存抽象模块的API。
参数设备索引应用于选择内存抽象模块(以及内存设备)。如果只配置了一个内存抽象模块,则应忽略参数设备索引。
例如:
#define MemIf_Write(DeviceIndex, BlockNumber, DataPtr) \
Fee_Write(BlockNumber, DataPtr)
如果配置了多个内存抽象模块,则内存抽象接口应使用有效的机制将API调用映射到适当的内存抽象模块。
注意:一种解决方案是使用指向函数的指针表,其中参数开发索引被用作数组索引。
typedef struct
{
uint8 DeviceIndex;
Std_ReturnType (WriteFctPtr)(uint16 BlockNumber, uint8* DataBufferPtr);
}MemIf_Write;
MemIf_Write MemIf_WriteFctPtr[] =
{
{0, Fee_Write},
{1, Ea_Write},
}
Example:
#define MemIf_Write(DeviceIndex, BlockNumber, DataPtr) \
MemIf_WriteFctPtr[DeviceIndex](BlockNumber,DataPtr)
如果配置了多个内存抽象模块,并且为该模块启用了开发错误检测,则内存抽象接口API的功能应检查参数设备指数是否为现有设备或模块服务中的广播标识符。
内存抽象接口API的功能应向默认错误参数跟踪器(DET)报告检测到的错误,错误代码为MEMIF_E_PARAM_DEVICE,不得执行被调用的服务。
如果内存抽象接口API的调用函数检测到属于非法参数设备索引的错误并具有返回值,则应设置如下:
MemIf_GetStatus: MEMIF_UNINIT
MemIf_GetJobResult: MEMIF_JOB_FAILED
All other functions: E_NOT_OK
4.1 MemIf_SetMode
MemIf_SetMode调用所有底层内存抽象模块的“SetMode”功能。
注意:上述功能中故意遗漏了设备索引,即内存接口应将所有底层模块切换到请求的模式。在这种情况下,不需要一个额外的“广播”参数,因为设备不能单独切换到不同的模式。
4.2 MemIf_Read
MemIf_Read调用由参数DeviceIndex所选择的底层内存抽象模块的“读取”功能。
4.3 MemIf_Write
MemIf_Write调用由参数设备索引所选择的底层内存抽象模块的“写入”功能。
4.4 MemIf_Cancel
MemIf_Cancel调用由参数设备索引所选择的底层内存抽象模块的“取消”功能。
4.5 MemIf_GetStatus
MemIf_GetStatus调用由参数开发索引所选择的底层内存抽象模块的“GetStatus”功能。
4.6 MemIf_GetJobResult
MemIf_GetJobResult调用由参数DeviceIndex所选择的底层内存抽象模块的“GetJobResult”功能。
4.7 MemIf_InvalidateBlock
MemIf_InvalidateBlock调用由参数设备索引选择的底层内存抽象模块的“无效验证块”功能。
4.8 MemIf_EraseImmediateBlock
4.9 MemIf_EraseImmediateBlock
MemIf_EraseImmediateBlock调用由参数设备索引选择的底层内存抽象模块的“立即删除块”功能。
5.依赖的接口
6.小结
如果不同时使用Fee和Ea,则MemIf模块的功能非常简单,就是一个底层Ea或者Fee的宏封装层。