AUTOSAR存储栈分析之MemIfFee

电子说

1.3w人已加入

描述

MemIf

和所有的抽象层作用差不多,MemIf把Driver层的模块抽象出来提供给上层使用,具体层级结构如下:

AUTOSAR

NvM调用MemIf提供的标准接口,例如MemIf_ReadWrite等;在MemIf根据已配置的抽象驱动模块(FeeEA)分别调用不同的API,实际举例如下:

AUTOSAR

根据标准,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相关的接口,所以虽然规范定义了这样的层级结构,但是在实现上有多种可能,简单有效才是硬道理。 

Fee

之所以在车规MCU里需要提供这样的机制,主要还是为了节约成本,提供数据的高效、实时存储,满足车规对于Data Flash百万次刷写的要求。

在AUTOSAR的规范里,也提供了这样类似的示例机制来提高DFlash的使用寿命:

AUTOSAR

在该示例中,共计有1500Bytes数据需要管理,这些数据被均匀分成10个Block;当Fee发现某个Block数据更改并且需要重新编程的时候,他会找到目前空闲的Flash空间把数据写进Flash并设置有效。需要注意的是,在设计Fee驱动时,需要考虑到Flash IP支持的最小可擦除单位和最小可编程单位,只要熟悉IP特性,才能做好Flash磨损均衡算法。

小结

NvM的状态机每家供应商的代码区别还是挺大的,不过我们在看代码的时候首先需要了解这些API的调用时序,如下图为用户调用NvM_Write服务的时序图:

AUTOSAR

熟读AUTOSAR NV Data Handling Guideline,才能更好理解代码,必要时自己画一个状态迁移图。

来源:汽车MCU软件设计

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分