单片机冷启动和热启动

2019-04-15 16:19发布

1、单片机的冷启动和热启动都是和单片机的启动(复位)有关,冷启动对应的复位就是上电复位,通过单片机的复位引脚产生的复位属于热启动,看门狗这样的内部复位也属于热启动,还有我们使用STM32的库函数提供的软件复位函数也属于热启动。 2、热启动和冷启动的本质区别在于:热启动时,单片机硬件上不会对ram进行初始化,这里面的ram保持复位之前的状态不变。冷启动,单片机硬件上把ram的值全部初始化成0xff或者0x00。 3、我在一个博客上看到怎么判断单片机的复位是冷启动还是热启动。博客地址如下:http://blog.csdn.net/zhzht19861011/article/details/6249318 4、其实判断冷启动还是热启动在一些特定的场合很有必要性。举个例子,一个成熟的产品上肯定有看门狗复位的功能,看门狗会导致单片机复位,如果我想知道此次复位是由看门狗引起的还是断电引起的,就需要去判断是冷启动还是热启动。 5、博客中的方法就是说找到这个单片机的一段ram,每次上电都先去读这段ram中是否有我们之前标记的数值,如果是0x00或者0xff,那么说明是冷启动,也就是断电导致的重启。如果读到的是我们之前给内存写过的特定的值,那么就是看门狗或内部或按键引脚的复位。 6、博客中还提到一个问题,那就是做这通过实验发现就算是热启动,读到的内存是只还是0x00,原因是MDK编译器的问题。作者验证的方法是,先去看了启动代码,发现启动代码并没有做内存的初始化的操作,所以作者去对代码进行了反汇编(从这看出这家伙有些本事的),他发现启动代码执行完后,并不是去直接执行main函数,而是在中间执行了一些编译器的函数,编译器的函数中有个函数实现了把ram初始化成全0。所以问题出在编译器上,那么如果不想让MDK的编译器去帮我们做ram的初始化,可以把MDK的NoInit选项勾选上。