|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
目录
1.MemIf
2.Fee
3.小结
在前面存储栈分析中,我们描述了服务层NvM的功能、使用场景,其实对于使用者来说,了解如何使用配置工具完成NvM Block的配置、关联好下层的驱动模块就已经足够了,但是这样当NvM出现问题后,不了解原理定位起来就很麻烦:例如MemIf、MemAcc这些层级结构,基础软件供应商对应这块驱动的客制化代码。因此接下来简述下这些模块的作用,让大家对这块有个大概思路。
1.MemIf
和所有的抽象层作用差不多,MemIf把Driver层的模块抽象出来提供给上层使用,具体层级结构如下:
NvM调用MemIf提供的标准接口,例如MemIf_Read\Write等;在MemIf根据已配置的抽象驱动模块(Fee\EA)分别调用不同的API,实际举例如下:
根据标准,Fee或者Ea又会调用MeeAcc提供的接口去访问不同的Flash驱动。我们以Vector的实际代码为例,在MemIf层配置提供的接口如下:/**-- MemHwA Function Pointers --**/CONST(MemIf_MemHwAApi_Type, MEMIF_CONST) MemIf_MemHwaApis[MEMIF_NUMBER_OF_DEVICES] ={/* Fee_30_SmallSector */ { Fee_30_SmallSector_Read, MemIf_Fee_30_SmallSector_WriteWrapper, Fee_30_SmallSector_EraseImmediateBlock, Fee_30_SmallSector_InvalidateBlock, Fee_30_SmallSector_Cancel, Fee_30_SmallSector_GetStatus, Fee_30_SmallSector_GetJobResult, Fee_30_SmallSector_SetMode }}; 在Fee层级配置的Flash驱动接口如下/* FLS API pointer table */CONST(Fee_30_SmallSector_FlsApiType, FEE_30_SMALLSECTOR_PRIVATE_CONST) Fee_30_SmallSector_FlsApi0 = {/* Read Service */ Fls_Read, /* Write Service */ Fls_Write, /* Compare Service */ Fls_Compare, /* Erase Service */ Fls_Erase, /* Blank Check Service */ Fls_BlankCheck, /* Get Status Service */ Fls_GetStatus, /* Get Job Result Service */ Fls_GetJobResult};发现没有,这一层的API并没有MemAccM相关的接口,所以虽然规范定义了这样的层级结构,但是在实现上有多种可能,简单有效才是硬道理。 至于这个NvM状态机,这里就不赘述了;主要是一两句写不清楚。2.Fee
之前写过一篇关于Flash模拟EEPROM的文章:Flash模拟EEPROM原理浅析。之所以在车规MCU里需要提供这样的机制,主要还是为了节约成本,提供数据的高效、实时存储,满足车规对于Data Flash百万次刷写的要求。在AUTOSAR的规范里,也提供了这样类似的示例机制来提高DFlash的使用寿命:
在该示例中,共计有1500Bytes数据需要管理,这些数据被均匀分成10个Block;当Fee发现某个Block数据更改并且需要重新编程的时候,他会找到目前空闲的Flash空间把数据写进Flash并设置有效。需要注意的是,在设计Fee驱动时,需要考虑到Flash IP支持的最小可擦除单位和最小可编程单位,只要熟悉IP特性,才能做好Flash磨损均衡算法。3.小结
NvM的状态机每家供应商的代码区别还是挺大的,不过我们在看代码的时候首先需要了解这些API的调用时序,如下图为用户调用NvM_Write服务的时序图:
熟读AUTOSAR NV Data Handling Guideline,才能更好理解代码,必要时自己画一个状态迁移图。
|
|