问题1:MTS请教各位: 软件能判断ARM系统是上电冷启动复位还是运行中热复位吗?
问题2: 请教:为什么上电冷启动复位时RAM中的内容是随机的? 而当热复位时RAM中的内容却一定保持在热复位前的内容状态? (所说RAM是指复位后未被启动程序覆盖的RAM区)
微信群中的讨论摘要:
1:@Terry 通过查看RAM中预设的复位标记位来判断是上电复位还是热复位,似乎不可靠? 因为上电冷复位后RAM中的内容是随机的,不能做为判断依据。
2:系统运行中的复位,都是热复位,包括看门狗
3:@MTS 你先指明是ARM的哪类产品?AP还是MCU
4:@SimonLuk 主要是集成ARM内核的SOC,包括McU。那个问题是否由RAM内存控制器的硬件设计决定? 各个系统都是一样的?
5:有人写过这样的博客,你的问题应该和ram,及arm的设计有关,至于为何得细看了
6:@Terry 那篇博客我看到了,它是通过在RAM中设置标志位来判断是上电冷启动复位还是热复位。我觉得有点问题,就像它博客中所说的“上电复位冷启动后内外RAM的内容是随机的",但它却以这个随机不确定的RAM标志位作为判断依据?
7:@MTS 在实际应用中,好像没有不对ram进行初始化,而使用其中的内容。纠结这个问题的应用背景是什么呢?
8:无论是热启动还是冷启动。程序开始执行,肯定首先是对ram进行初始化。
9:不用纠结热复位还是冷启动,对于reset,要搞清的是,无论通过何种方式触发的reset,作用域在哪?
10:SRAM的原理,参考RS触发器。AP那边的结构我不清楚,MCU这边很简单,图我上次都给你看过了,无论什么形式的系统复位,最后执行的动作都是相同一个(备份域复位例外)。复位后,寄存器恢复复位值,RAM也会在初始化代码的作用下清空。
11:@MTS 我不明白你纠结复位后保留RAM内容的目的是什么。复位原本的目的,就是让芯片重新开始。如果只是要“从头”开始,写段asm代码,改变寄存器的值就可以了
12:@SimonLuk 复位后保留RAM内容的目的是“程序重运行,但RAM中指定位置的数据要保留不变,可被重新调用。(RAM中指定位置的数据不能初始化清0)
13:@MTS 写代码要假设复位后ram是随机内容,既不是0,也不是原来的内容不变。其他免谈。否则可靠性就是儿戏。
14:@傻孩子 对于DRAM,由于复位保持时间和刷新时间等问题,内容可能会丢失。对于SRAM,只要保持不断电、不写,内容就不会变,这是RS触发器的原理。
15:@SimonLuk 硬件是硬件,软件要可靠,要逻辑确定就,要可移植性强,要偷懒,就必须做这种假设。太依赖具体某一平台的硬件特性,就是给软件工程师自己找麻烦。
16:@MTS 你的编程思想值得商榷。你是要把地球用原子弹炸掉,然后只留一片诺亚方舟?
17:@MTS 那就使用带电ram
18:@MTS 想要检查是否复位,不用检查RAM的内容,那是20年前单片机的做法。现在只要检查Systick就够了,只要复位,Systick必定从0开始。
19:@SimonLuk 还有,Systick是否为0貌似不一定的……我要找菜式家族确认下
20:@傻孩子 Systick的Val寄存器,复位后会清零的
21:@SimonLuk 真的不一定的,有一个掉电保护模式,不太常见,但真的有
22:@傻孩子 噢,那可能是AP吧,MCU没有
23:@SimonLuk MCU有的,我去确认过的
24:@傻孩子 MCU只有备份域吧
25:@SimonLuk 嗯,类似。但醒来的时候和复位大体类似。但部分寄存器可能不为0
26:@Williamgao systick的计数值,在复位后是否清零?Cortex-M的SysTick寄存器,复位后一定是0么?
27:@傻孩子 备份域的寄存器是不清零的
28:@傻孩子 systick 文档写的是unkown
29:@SimonLuk 结论有了,所以,不能依赖这个值。你依赖,出问题,arm只能一脸懵逼。经验结论和design spec(TRM)你信谁?——ARM说我不管。如果你不相信今天的讨论,请发邮件到support-core@arm.com
30:@傻孩子 我回去翻手册,有写的。这个值我是确认过的
31:@SimonLuk 具体核确认过其实是两回事……因为spec写unknown ,所以,做实现的人可以给他0,也可以不管(悬浮)
32:@傻孩子 复位后,Systick VAL值硬件上确实是Unknow,但是只要没有另外定义,初始化的时候,就会清零。
非常感谢MTS的总结,利人利己,赞