EDN China > 其它文章 > 嵌入式系统 > 正文
?

关于掉电保存数据的思考

作者:tuoxie: EDN China?? 2009年03月15日 ?? 收藏0

  EDN博客精华文章??作者:tuoxie

  我是搞仪表的,基本工作简单说就是弄个人机界面把一些参数存储到flash。程序就是根据这些参数运行,实现一个个软件功能。有些软件模块需要记忆一些变量,目的是再次上电后能继续运行。为了实现这个功能我们基本上有两条路可以走。一是用电池给ram供电,掉电不丢;二是掉电进掉电中断,把你要保存的数据保存下来。

  我们以前都是走第一条路的,走的还不错。主要的问题就是不同的时间点掉电,数据可能没有完全修改完,这样的数据是没有意义的,需要恢复到正确值。办法就是弄AB两份,通过校验,取正确的一份。麻烦是麻烦,但是总是能弄好。

  最近出于对成本的考虑,领导想走第二条路。前几年公司里有人这样走过,但是没走通,原因是时间不够。以前用51的芯片,现在换成STM32的了,鸟枪换炮,再试试。

  领导让再试试我们做马仔的只能硬着头皮去试试。

  我首先考虑的是怎么存的问题。肯定不能像第一条路那样搞n多标志位,以前咱不懂,但是年纪小精力足,愣是把这么乱的逻辑弄清楚了。现在知道痛了肯定不能这么搞。原则一:逻辑要尽量简单。

  以前为了支持在任何地方掉电不错,所以逻辑做的复杂了。那么现在能不能不让他在任何地方掉电,让他在我指定的几个地方掉电呢?当然可以。基本思路出来了:中断里置标志位,在主循环里去查找。一旦发现就存储,存好就死在那里等掉电。

  试验结果:没戏!50%成功率都危险。原因是有些软件模块耗时挺长的,等轮到检测代码时已经掉电掉的差不多了。看着各个模块里被插满掉电检查函数的时候,我知道这条路也不行。

  存看来只能在中断里存了。有些和flash无关的模块当然没有问题,有些模块本身是要操作flash的。这个难不倒我,做个互斥,和flash相关的模块在处理完后赶紧去查询掉电中断,如果已置起就赶紧保存数据。

  这么一搞成功率一下子升到95%。没戏,我要的是200%。王八盖子的,不能倒在胜利的大门前。开始肯定怀疑是最坏情况下时间不够(正在处理flash时掉电),通过示波器观察时间足够。那是怎么回事?

  思考了半天,难道我在开机时就进了掉电中断?试验了一下还真有这样的情况。那就简单了,延时一下,等电压稳定后再开中断。初步掉电了200次都正确。周末在做掉电测试。欲知结果,听下回分解吧


?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

掉电保存数据? STM32?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈