【IoT】STM32 FLASH 掉电数据丢失处理策略以及备份机制

简介: FLash机制

2019032317401783.png

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个字节的数据,如果发生某个扇区没有成功更新(即恢复到之前的数据),就会发生新旧数据同时存在的情况,程序利用这些数据来操作,就有可能发生错误。

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

从《天道》的角度谈谈产品规划
原创2023-02-24 21:05·产品人卫朋
今天主要借用《天道》中丁元英的商业案例来谈谈产品规划这个话题。

《天道》这部被众人追捧的影视剧来源于豆豆的成名作《遥远的救世主》。

如果没有全局做过产品或者市场的规划,而且是初次接触这部剧。

你就会惊叹于主人公的组局、布局,以及成局的能力。

从互联网拥簇的评论声中,也可见一斑。

剧中的丁元英甚至都有一种被神化的趋势。

而随着个人知识和阅历的增加,再加上每年也都要做产品规划。

也逐渐对这部剧或者这本书有了一些新的认识。

究其本质,这是一种战略性的思维,也是一种规划的能力。

更是一种市场与内部能力的匹配过程。

笔者之前也分享过这块的内容,也看到了一些质疑。

怎么能用虚拟的案例做讲解呢?

其实这么做的原因主要有两点考虑:

首先,这部剧中的商业案例的整体逻辑是自洽的,而且也符合当时的商业环境。

其次,整部剧将整个商业案例完整地呈现了出来,也包括其中很多的决策细节。

这就要比分析现实案例直观得多,也更加有指导意义。

再回到产品规划这个话题上来。

产品规划从本质上来说是一种推演能力,也就是根据第一性原则推演产品从0到1、从1到100的一个过程。

如果说一款产品是一个点的话,那产品规划便是通过构造一种系统能力以达成企业最终的商业目的。

第一性原理是埃隆·马斯克非常推崇的一种思维模型。

通常来说,企业愿景对应的便是企业的第一性原则。

围绕第一性原则可以激发资源优势、制定细分市场目标,最终实现企业目标。

下面以影视剧中丁元英操盘的格律诗音响项目为例,谈谈产品规划。

格律诗音响公司的企业愿景是实现王庙村生产力和市场的对接,最终实现农户脱贫。

这是企业的愿景,同时也是丁元英承诺要给红颜知己芮小丹创造的神话。

启动一个项目或产品,资源和人力配置是你首先要考虑的。

企业在不同的发展周期,对人的要求是有很大差异的。

丁元英在分析完这些人的本质之后,并没有把自己的全套计划完整地告诉原始这些人。

而是通过市场的变化来淘汰掉一部分人。

因为这部分人现在不淘汰掉,在以后的市场变化中,可能会给公司带来毁灭性的灾难。

下面就先梳理一下其中的关键人物:

丁元英作为格律诗音响项目的唯一操盘手,全局规划了整个项目。

他的优势是自己在欧洲的人脉和战略规划能力,以及在欧阳雪等人心中的影响力。

同时,作为发烧级音乐玩家,他对音箱的独特见解也为他们打造差异化的产品起到了关键助力作用。

差异化的意思是相比于竞争对手,你的独特优势或者护城河,没有这个前提,整个策略也就无从谈起,这为他们赢得了时间上的先机。

在音响这个市场,竞品已经很成功了,而且他们提供的价值点已经被用户接受。

如果按照他们的价值点去做产品,你就永远只能跟在他们身后。

这时候就需要找一个跟他们不一样的价值点,做差异化。

欧阳雪这个人呢,做事很踏实,很讲义气,不贪心。优势是人脉、资金和社会地位。

这个人的价值在于她对格律诗的绝对控股,这样就可以确保关键决策权的归属。

由于每个人的认知水平的限制,很多时候不同个体看到的终局是有极大差异的,这个时候你就需要考虑如何增加成事的确定性。

如果开公司的话,股权的分配问题是你优先要考虑的。

不赚钱的时候,大家还都能力出一孔。一旦公司有起色,每个人就开始有自己的诉求,不确定性也就随之而来。

肖亚文见过世面,知道公司怎么运行,知道商务谈判和商务合作的事情,是很精明的职场人物。

而冯世杰和叶晓明想成就一番事业,但没有机会,能够脚踏实地的做事情,但眼光欠缺。刘冰是小人物,唯利是图,关键时刻不能顶上,迟早会被淘汰。

叶晓明,冯世杰,刘冰这三个人的优势就是懂音乐,会组装,可以作为高级技术工。

同时,这三人和王庙村农民有一定的关系,可以作为连接的纽带,核心竞争力是技术和人脉。

乐圣公司的掌舵人是林雨峰(竞争对手),但太过刚硬,只知道进攻,不懂防守,考虑问题存在漏洞。

这就有点类似竞争分析了,通过分析竞争对手的漏洞,找到破局点,制定商业竞争策略。

接下来就需要统一思想了:

想要以小博大,达成乐圣跟王庙村合作的目的,就必须把优势发挥到最大效果。

这才有几次股东开会,召集农民兄弟一起开会等,就是为了统一思想。

市场的生存竞争非常残酷,胜负往往就在毫厘之间,微弱的优势都可能成为关键一环,你比他多一口气,你就是赢家。

最后,丁元英就把这些人的优势资源整合起来,按照需要组建公司,精心规划。

详细案例分析可以参阅笔者之前的文章。

卫朋

人人都是产品经理受邀专栏作家,CSDN 嵌入式领域新星创作者、资深技术博主。2020 年 8 月开始写产品相关内容,截至目前,人人都是产品经理单渠道阅读 56 万+,鸟哥笔记单渠道阅读200 万+,CSDN 单渠道阅读 210 万+,51CTO单渠道阅读 180 万+。

卫朋入围2021/2022年人人都是产品经理平台年度作者,光环国际学习社区首批原创者、知识合作伙伴,商业新知 2021 年度产品十佳创作者,腾讯调研云2022年达人榜第三名。

文章被人人都是产品经理、CSDN、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。

相关文章
|
16天前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
|
9月前
|
存储 芯片 内存技术
STM32速成笔记(十二)—Flash闪存
本文简单介绍了什么是Flash。针对STM32F1的Flash做了详细介绍,介绍了操作Flash的步骤,并且给出了程序设计。最后,介绍了一些注意事项。
68 0
STM32速成笔记(十二)—Flash闪存
|
存储 关系型数据库 编译器
STM32学习笔记:读写内部Flash(介绍+附代码)
STM32学习笔记:读写内部Flash(介绍+附代码)
304 0
|
存储 内存技术
STM32内部flash详解(1)(下)
STM32内部flash详解(1)
|
存储 缓存 关系型数据库
STM32内部flash详解(1)(上)
STM32内部flash详解(1)
|
存储 安全 芯片
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
915 0
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
|
21天前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
69 2
|
2月前
|
传感器
|
21天前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
67 4