查看原文
其他

【√】以后复位芯片,数据再也不会丢了(理论篇)

bug菌 最后一个bug 2021-01-31


1、聊一聊

    今天跟大家推荐一首汪苏泷的<不服>,汪苏泷的作词作曲能力没得说,这里估计版权问题无法展示,所以推荐大家去听一听原版歌曲。
    好了,这篇文章主要是跟大家讨论一下芯片冷启动和热启动的程序处理软件设计技巧。

2、内存浅析

    大部分小伙伴最开始接触的内存应该是笔记本的内存条吧,内存其实更多的是直接和CPU通过地址总线和数据总线进行数据交换的高速存储设备,目前几乎所有的计算机程序都是在内存中运行的,对于单片机系统由于其主频率不是特别高,它可以在Flash上运行相应代码,不过同样也需要借助RAM进行数据处理以提高效率。

解析一下:
  • 上图中为了提高数据命中CPU部分会引入cache等高速缓存,其实本质上也是内存的一种,只是说CPU访问速度要比平时的内存高个几个数量级。

  • 既然有内存就应该有外存,其实广义上来讲,所以的外部存储设备都可以认为是外存,不过一般都认为对于CPU上有独立编址、并且可以直接访问的存储设备叫外存,也就是说CPU可以直接通过物理总线进行访问,不过一般需要经过一些高速内存控制器作为CPU与外存的桥梁完成数据访问,那么磁盘等无法直接通过CPU进行地址访问的这里就叫外部存储介质,一般这样的介质在OS中会搭配对应的文件系统进行使用。   

  • 同样对于单片机内存就是对应的RAM,像STM32会有对应的总线控制器来扩展内存,我们叫其外存,而对于内存独立编织的Flash可以认为是一种只读内存,不过其掉电不会丢失数据

说明一下:

    今天为了便于讲解,统一称为RAM,各大教材在介绍ram的时候都会讲到其特性是:掉电以后数据丢失,上电以后数据随机;而其他存储介质比如Flash,EEPROM或者磁盘,其正常掉电是不会丢失数据的,除非掉电过程进行非法操作导致数据破坏。

3、芯片的“冷启动”与“热启动

    首先对于冷启动和热启动理解一下:

冷启动:
  • 也叫做掉电复位,冷启动就是之前程序没有运行,系统处于掉电状态然后通过上电运行程序的过程认为就是冷启动,对于有部分芯片还会存在启动引导区域,芯片会通过启动引导区选择启动类型,数据搬移等等,然后最终进入程序运行区域。

热启动:
  • 而我们热启动过程是不存在掉电过程,且外围外设均处于供电状态,其芯片由于异常比如复位引脚电平变化,看门狗复位,或者软件复位,仅仅只是说把程序指针指向程序运行起始位置等并进行继续执行,而起始位置不同芯片有所差异,存在可能会直接复位到引导区域,或者仅仅只是复位到应用程序起始运行位置,所以需要具体根据芯片机制进行判别。

    不过对于冷启动和热启动以复位那一时刻为分界线进行差异分析,主要是系统寄存器、外设、RAM等有没有被清除或者被恢复为默认,对于冷启动系统上电复位所有寄存器恢复为默认,RAM存储数据随机;而运行时复位几乎所有的寄存器等均为复位前状态,一些小伙伴该问了,为什么我玩单片机的时候一旦复位所有的状态都变成了初始化状态?因为从系统复位到main函数执行MCU进行了大量的构造环境工作。

4、掉电与复位数据处理

1)需求驱动技术  

    做实际项目中客户经常会有这种需求 : 系统断电以后希望能够保存目前系统的状态,等再次上电能够恢复到之前的状态。同样应该有很多小伙伴有这样的惨痛的教训,写了许久的论文或者是敲了几个小时的代码,电一断全部凉凉。曾记得之前办公室跳闸,导致一位同事写了一下午的代码一瞬间没了,真的是头皮发麻,现在还能想起当时他的表情,真的太难了。

    然而掉电复位与系统异常重启又是两个概念,其处理办法和方案也有所不同,请看下面两种处理办法:

2)掉电数据保存方法  

    这里掉电启动属于一种冷启动,基本上RAM中的数据在掉电的瞬间是无法复原了,所以该掉电的软件设计方案一定是在掉电前进行最后的收尾处理,比如目前最常见的解决办法是构建系统的电源管理:(如下图所示)

    让其支持UPS功能(也就是我们的不间断电源),当系统UPS电源检测到电网掉电,然后做好最后的掉电信息存储,并在电池即将耗尽进行系统收尾处理;看来这种方案是非常完美的,不过这样势必就增加了整个系统的成本。

    然而另外在成本和损失之间做权衡的一种方案就是常用的定时保存,这种在office软件中应该大家有感受,如果一旦断电其软件能够恢复到之前的某个保存的时间点。

3)复位数据恢复方法  

    相对于掉电复位,此类型的系统复位软件设计相对不同,对于动态信息的主要存储中心内存,其内部仍然保留有大量的用户复位前的信息,除了一些在运行过程中CPU正在处理的数据会有可能被丢失、破坏或者系统发生了非常严重的故障导致RAM被破坏之外,当异常复位或者软件重启大部分当前用户信息是可以恢复的。

    所以首先要做的就是识别当前复位启动形式:是冷启动还是热启动,如果是热启动看能否直接通过内存进行数据恢复,如果检测数据被破坏看能否通过用户确认或者是历史数据记录进行修护,否则只能通过掉电保存数据恢复到之前的状态。

   这里作者对于该部分先不进行展开,准备下一篇文章以一个实例来跟大家讲解具体操作。

5、最后小结

    作者在这里也提醒各位小伙伴平时写写文档或者代码的编辑可以养成经常使用Ctrl+S的习惯,当然用笔记本电脑再合适不过了,所以现在高效程序员需要精通的三大组合键:

    ”Ctrl+C”/”Ctrl+V”/”Ctrl+S”

    好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!

推荐好文  点击蓝色字体即可跳转

【重磅】【完全解读】RTOS中的任务是线程?进程?还是协程?

【涨知识】OS下的内存使用原来这么复杂

【原理分析】来看看惯性轮自平衡自行车实现原理

【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

☞ 【典藏】别怪"浮点数"太坑(C语言版本)

GUI必备知识之“告别”乱码(浅显易懂)

【典藏】大佬们都在用的结构体进阶小技巧

【经典】把脉printf中的C进阶技巧

【典藏】自制小型GUI界面框架(设计思想篇)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存