历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2021年02月06日 | STM32 FLASH 掉电数据丢失处理策略以及备份机制

2021-02-06 来源:eefocus

1、原因

由于FLASH的擦除和写入的特性,如果在擦除中掉电或者写入时掉电,有可能会出现失败的情况,下次再上电读取就会出错。


擦除的时候掉电,不能保证擦除完全,但是已经擦除的部分,肯定是0xff了。


写的时候掉电,已经写入的就是正确的,电平掉到最低极限工作电压附近时,写入的就无法保证了,地址无法保证,写入的值也无法保证。没有写到的,肯定还是 0xFF。  


2、解决方式

2.1、硬件方式解决 — 掉电保护机制 

必须硬件电路上有相应的掉电警告中断,而且必须有足够的时间供软件响应。  

掉电保存和上电恢复,需要以下: 

1) 快速检测掉电信号;

2) 要有足够的时间让你停下来保存现场;

3) 上电后可靠的复位; 

这些的关键是掉电信号电源复位信号三个怎么配合的事;

掉电保护不是重新擦写那么简单,首先要有一个机制能知道发生了掉电事件,还要知道什么地方的数据是可能出错的,如果是新建文件还好一点,一般就是数据作废,如果是改写一个文件时发生掉电事故的话,还要有恢复机制,将数据恢复成改写以前的数据。


由于 flash 的先擦后写的特性,不会在原来位置重新写数据,一般都是把原位置的数据标记为无效,再在新位置写入数据,对于文件来说有一个存储位置的关系,这不同于文件系统的逻辑地址,每个逻辑地址要有对应的物理地址,要有一套逻辑-物理地址的转换映射关系在里面。


flash 空间总是有限的,还要有垃圾回收的机制,系统要将无效数据的存储空间回收。

而 nand 的擦单元是写单元的2的n次幂(如32,64,128)倍,如果一个擦除单元内有有效数据的话,还要将有效的数据搬移到其它地方,要对相应的文件的地址映射进行更新维护。


擦写均衡的实现也是一件比较复杂的事情,所以我们看到的U盘大小总是小于标定的大小,因为它内部要保留一定区间用来实现FTL的算法,保存FTL层的数据。  


如果是这么个要求让我重新设计一下硬件的话会有如下几个部分:

1) 电源管理芯片,检测掉电事件的发生; 

2) 储能元件,在掉电发生后能满足执行掉电保护的操作即有足够的时间存储一些标志位和必要的数据;

一个电源检测芯片,一个储能元件(比如大点的电容)结合软件判断以及提前保存现场就能很好的实现掉电保护了.


2.2、软件方式解决 

1)要改写某扇区内容,先把该扇区内容备份到一个特殊的扇区; 

2)在某个地方写一个特殊的标记; 

3)完成该扇区的改写操作,清除标记; 

4)系统每次上电或复位,都去检查下标记,就跟windows下的“磁盘扫描程序”一样,即使最坏情况,也可以恢复改写之前的数据。


这个过程“备份->置标记->写->清标记”的办法,是个可行的办法,也是目前比较通行的办法。


示例:

如下图所示:

使用两个sector互为备份,首先判断valid,如果数据都有效,比较version看谁的数据比较新,使用最新的数据。


正常的情况下: 

1)初始化,sector 0和sector 1的valid值都为0xff,使用sector 0擦写,version为0,valid为0x5a。 

2)第二次擦写,sector 0的valid为0x5a,sector 1的valid为0xff,表明sector 1为无效数据,使用sector 1擦写,vesion在上次的基础上加1,valid为0x5a。 

3)第三次擦写,sector 0和sector 1的valid值都为0x5a,比较version,sector 1的version比sector 0大,所以使用sector 0擦写,sector 1为备份数据,version加1,valid为0x5a。 

4)依此类推,擦写数据的过程中,version高的为最新数据,version低的为备份数据。


掉电的情况下: 

1)如果在擦除sector 0的时刻掉电,前半部分数据为0xff,后半部分数据是旧数据;重启后比较valid都为0x5a,进而比较version,因为最新数据的version没有写进去,所以sector 1的versoin较高,使用sector 1的旧数据。 

2)如果在擦完sector 0的时刻掉电,所有数据都为0xff;重启后sector 1的valid为0x5a,使用sector 1的旧数据。 

3)如果在写sector 0的时刻掉电,前半部分数据为新数据,后半部分数据为0xff;重启后sector 1的valid为0x5a,使用sector 1的旧数据。


相对网络上搜索到的掉电备份方法(写备份区-备份标志-写目标区-清备份标志),优点是每次修改数据只需要擦写一次,速度较快;缺点是存储一个sector的数据需要两个sector的空间。


注意:

这个标记必须是单独占用一个无用的扇区(没有实际有用数据的扇区),保证对标记的操作不会影响到实际数据。

二是这只能保证数据能恢复到之前的状态,不能确保数据结构的完整性。


譬如你有一个数据结构有16字节(它们之间是有逻辑关系的),跨两个扇区保存,现在要全面更新这16个字节的数据,如果发生某个扇区没有成功更新(即恢复到之前的数据),就会发生新旧数据同时存在的情况,程序利用这些数据来操作,就有可能发生错误。


所以,还需进一步的机制来保证“整体数据结构”的完整性,譬如某个文件的一部分数据坏掉了,那么就把整个文件无效掉。

 

refer:

https://www.csdn.net/gather_2d/OtDaAg2sNjI0LWJsb2cO0O0O.html
https://blog.csdn.net/weixin_38664664/article/details/78167655


推荐阅读

史海拾趣

长江微电(cjiang)公司的发展小趣事

2022年8月,美国商务部出台了一项断供禁令,禁止向中国出售用于芯片设计的特定类型的EDA软件。这一制裁措施对中国的半导体行业造成了巨大冲击。然而,长江微电并未因此气馁,反而借此机会加大了对电感产品的研发力度。通过自主创新,公司成功开发出了一系列高性能、高品质的电感产品,满足了国内外客户的需求。这一成就不仅彰显了长江微电应对国际制裁的勇气和智慧,也为中国半导体行业的发展注入了新的活力。

Danube Enterprise Co Ltd公司的发展小趣事

随着市场的竞争日益激烈,Danube意识到单纯的技术创新已经不足以支撑公司的长远发展。于是,公司开始注重产品的品质和品牌的塑造。他们引进了先进的生产设备和质量管理体系,对每一个环节都进行严格把控,确保每一件产品都符合高标准的质量要求。同时,Danube还加大了品牌宣传的力度,通过参加国际电子展、赞助体育赛事等方式,提高了品牌的知名度和美誉度。这些努力让Danube的产品在市场上获得了更多的认可,公司的业务规模也逐渐扩大。

Engelking Elektronik GmbH公司的发展小趣事

随着国内市场的饱和,Engelking Elektronik开始寻求海外市场的发展。公司制定了详细的国际化战略,包括参加国际电子展会、拓展海外销售渠道以及建立海外生产基地等。通过不断努力,Engelking Elektronik成功进入了欧洲、北美和亚洲等多个国家和地区的市场。同时,公司还积极适应不同地区的文化和市场需求,提供定制化的产品和服务。

Directed Energy Inc公司的发展小趣事

Directed Energy Inc公司自创立之初,就致力于在电子行业中推动技术创新。公司投入大量研发资源,开发出一系列高性能的脉冲式激光二极管驱动器和高压脉冲模块,这些产品凭借其卓越的性能和稳定性,迅速在市场上获得了认可。随着技术的不断迭代和升级,Directed Energy Inc逐渐在电子行业中树立了技术领先的形象,吸引了众多行业内的设计师和工程师的关注。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

GeneSiC公司的发展小趣事

随着市场竞争的加剧,CMDS意识到仅仅依靠技术创新是不够的,还需要提供差异化的服务。于是,公司推出了定制化MMIC设计服务,根据客户的具体需求和应用场景,量身定制解决方案。这种服务模式不仅提高了客户满意度,也增强了CMDS的市场竞争力。通过不断优化服务流程和提高设计质量,CMDS逐渐在定制化服务市场上树立了良好的口碑。

问答坊 | AI 解惑

2008电子设计大赛题目预测 I题 运水机器人

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 有人预测这是专科组的!~!  …

查看全部问答>

关于return的作用

//////////红外接收子程序//////////void service_int2() interrupt 2 using 2{     //EA=0;     uchar i,j,n=0;  uchar a[4];  if (IRIN==1) {   return; } for (;n ...…

查看全部问答>

wince改rom-only文件系统,结果发现explorer.exe起不来

wince改rom-only文件系统,结果发现explorer.exe起不来,其他正常。希望大家指导下。谢谢…

查看全部问答>

关于ConnMgrEnumDestinations枚举可用网络

HRESULT WINAPI ConnMgrEnumDestinations(   int Index,   CONNMGR_DESTINATION_INFO *pDestInfo ); 既然是枚举可用网络,就可能返回多个值吧,这多个值是如何返回的?pDestInfo指向链表吗?msdn上没有提到 我想调用Conn ...…

查看全部问答>

有没有学gis 的高人啊,求问一下关于数据转换方面的问题! 100分

  最近在学习的过程中遇到了一个棘手的问题,就是关于gis中的数据转换的.     现在如果从传感器中得到了一些数据,请问用什么方法可以让这些电压数字信号变成能画图的数据文件。软件是mapx     如果有相关的思路和好的资料 ...…

查看全部问答>

EVC下 对话框下OnCreat函数不执行?

我创建个对话框工程,添加了个OnCreat函数,可是这个函数却不执行,请问这是什么原因?…

查看全部问答>

有问必答--关于UCOS

在这里创建这个帖子的目的是提高大家学习UCOS的积极性。如果大家在学习过程中遇到任何问题都可以在这里提问。坛子里的这方面高手希望大家经常来这里看一下,帮助大家解决问题。…

查看全部问答>

关于ICCAVR的编程,流水灯时间精确

请问如何让八个灯一秒闪一次呢?闪烁形式没有要求,八个灯是依次接到PD0~PD7上的,我刚刚接触ATmega16,懂得的只是少的可怜,希望大家帮帮我,鞠躬ing………

查看全部问答>