DSP

关于掉电保存数据的思考

2019-07-13 19:11发布

关键字:掉电保存数据   STM32   flash     EDN博客精华文章  作者:tuoxie   我是搞仪表的,基本工作简单说就是弄个人机界面把一些参数存储到flash。程序就是根据这些参数运行,实现一个个软件功能。有些软件模块需要记忆一些变量,目的是再次上电后能继续运行。为了实现这个功能我们基本上有两条路可以走。一是用电池给ram供电,掉电不丢;二是掉电进掉电中断,把你要保存的数据保存下来。   我们以前都是走第一条路的,走的还不错。主要的问题就是不同的时间点掉电,数据可能没有完全修改完,这样的数据是没有意义的,需要恢复到正确值。办法就是弄AB两份,通过校验,取正确的一份。麻烦是麻烦,但是总是能弄好。   最近出于对成本的考虑,领导想走第二条路。前几年公司里有人这样走过,但是没走通,原因是时间不够。以前用51的芯片,现在换成STM32的了,鸟枪换炮,再试试。   领导让再试试我们做马仔的只能硬着头皮去试试。   我首先考虑的是怎么存的问题。肯定不能像第一条路那样搞n多标志位,以前咱不懂,但是年纪小精力足,愣是把这么乱的逻辑弄清楚了。现在知道痛了肯定不能这么搞。原则一:逻辑要尽量简单。   以前为了支持在任何地方掉电不错,所以逻辑做的复杂了。那么现在能不能不让他在任何地方掉电,让他在我指定的几个地方掉电呢?当然可以。基本思路出来了:中断里置标志位,在主循环里去查找。一旦发现就存储,存好就死在那里等掉电。   试验结果:没戏!50%成功率都危险。原因是有些软件模块耗时挺长的,等轮到检测代码时已经掉电掉的差不多了。看着各个模块里被插满掉电检查函数的时候,我知道这条路也不行。   存看来只能在中断里存了。有些和flash无关的模块当然没有问题,有些模块本身是要操作flash的。这个难不倒我,做个互斥,和flash相关的模块在处理完后赶紧去查询掉电中断,如果已置起就赶紧保存数据。   这么一搞成功率一下子升到95%。没戏,我要的是200%。王八盖子的,不能倒在胜利的大门前。开始肯定怀疑是最坏情况下时间不够(正在处理flash时掉电),通过示波器观察时间足够。那是怎么回事?   思考了半天,难道我在开机时就进了掉电中断?试验了一下还真有这样的情况。那就简单了,延时一下,等电压稳定后再开中断。初步掉电了200次都正确。周末在做掉电测试。欲知结果,听下回分解吧 本文链接:关于掉电保存数据的思考 http://www.ednchina.com/ART_57952_29_0_OA_3231e802.HTM