我已经写了很多关于AUTOSAR Memory Stack相关的文章教程了,更多的案例是针对EEPROM的。
有好几个小伙伴问我,能不能写个关于Fee的。
那是当然的,不仅要写一个,要写好几个,讲详细点。
为什么大家喜欢用Fee的Fls,而不是Ea的EEPROM?我猜是成本问题,因为EEPROM要外挂额外的芯片,而Fls(DataFlash)是内置在MCU中的。
相对于EEPROM,DataFlash的缺点也是相当明显的:
擦写寿命较短;
擦写单位比较大。
你看之前文章(AUTOSAR的Memory是如何设计的?)提到的这个案例:
以下以在0x0008地址写入0x11, 0x22, 0x33, 0x44这四个字节内容为例,看看EEPROM和DataFlash的实际操作情况:
当然,这两个缺点也是有办法弥补的,不过要牺牲点时间效率为代价。
这样,项目到底用EEPROM还是用DataFlash做存储,那得根据实际使用需求做评估了。
Vector提供的Fee方案有两种:一种是常规的Standard Fee,另外一种是Small Sector Fee。
Vector的官网有详细介绍为什么有两种不同的Fee:
《Standard Fee and SmallSectorFee》(https://support.vector.com/kb/?id=kb_article_view&sysparm_article=KB0012027&sys_kb_id=8c2582281b2614148e9a535c2e4bcbe8&spa=1)
常规的Fee,一般是将Fls空间分为两个逻辑分区
在使用的时候,首先使用分区1
用完分区1后,再使用分区2
如果还要继续使用,就再擦除分区1使用,如此反复轮换使用。
我打算将这个过程原理做成视频,本文先放一段gif动图看看吧。
以上是Standard Fee的做法,这是因为Flash一把擦除单位比较大,所以才这么干的。
为了更好理解这个原理,引入两个概念:Sector和Page
姑且这么理解,Sector是Flash一次擦除的最小单位,Page是Flash一次写入的最小单位。
例如NXP S32K MCU的DataFlash的Sector大小是8K,Page大小是4Byte。
这就有个问题,一般情况下,一个数据段内容不会很大,都是很小的几个字节,第一次写倒是无所谓,如果第二次要改内容怎么办。要擦除8K的Sector才能重新写入这个更改的内容!嗯,很不合算!
于是,Fee就用了上文讲到的方法,两个Sector轮流来。
但是呢,并不是所有Flash的Sector都是很大的,也有很小的,例如瑞萨的RH850的DataFlash,Sector大小是64Byte,Page大小是4Byte。
好家伙,那就让一段应用内容数据占用一整个(即使多几个)Sector也不亏。
于是SamllSector Fee就来了。
还有个问题,一般情况下MCU内部的DataFlash的擦写周期P/E Cycle是10万次的,如果客户要求有段数据的存储擦写寿命要达到20万次怎么办。
那就要加入个叫“磨损均衡算法”的策略了,简单地理解,用双倍的空间存储这个内容。
这些策略,我在之前的文章有提及过。《AUTOSAR的Memory是如何设计的?》
这里不展开讲这些细节了,后续有机会出更多的图文或视频来讲解其原理和过程。
那接下来就是配置了,如果你学会Ea/EEP的配置,这个Fee/Fls的配置就很简单了,大部分概念和操作都是一样的。建议参考《AUTOSAR NvM模块配置详解》和《AUTOSAR Ea深度剖析》。
如果新手非要想看看Fee的具体操作配置,我后期再专门出个Fee配置的文章。
当然,我也会像之前分析Ea的方法那样,用PC的纯软件方式模拟Fee的读写行为(这可能会比Ea复杂很多)。
敬请期待!
如果你对我的《AUTOSAR实战教程》感兴趣,可以关注公众号“嵌入式软件实战派”,然后在对话框回复“AUTOSAR”,可获得教程的目录。
这个教程目录会定期更新,现在订阅号的规则改了,不会更新你以前获得的目录文章,需要你定期回复“AUTOSAR”获得最新的版本。