关于“请问看门狗复位后,RAM 中的数据会清空吗?”的讨论
看到这个问题以及相关的回答,感到有必要做些说明。这个问题问的很含糊,关键是你要做什么?
首先看RAM的工作原理和用途。RAM储存数据的基本原理是电容(荷)冲电,冲满电状态表示“1”,放掉电表示“0”。它在MCU中的基本功能作为“临时工作数据”的存储器。(太简单了,这是学校学的最基本的理论了,可是大家为什么不从这个简单的原理入手分析呢?)
OK!当系统长时间断电后,一旦上电启动,RAM中的数据自然为“0”。再看其它情况,AVR的复位还可能由WDT和BOD造成,前者,通常是用于用户程序的BUG或程序跑非造成,而后者是由于系统电压降落到一定的值(4.0v/2.7v)造成的,只要系统电压没有完全跌到2.7v下,理论上RAM中的数据是保存的。但实际情况不是这样的,因为由WDT和BOD造成的复位是随机的,你知道你的程序跑飞后,没有改写RAM?或在复位前的一刻,你的程序正在更新一个INT型(2字节)变量,或一组相关的变量,当它没有更新完成,复位了。你RAM中的数据可靠吗?
是的,单片机本身不会自己清除RAM中的数据的。但是MCU复位以后,应该做初始化工作,一般也包括将定义的变量初始化,所以正常情况下都将要将变量附初值,如果不附初值,一般习惯认为是“0”。所以,大部分(几乎全部)的高级语言平台,在编译用户程序前要增加自己的初始化代码,其中包括内存以及相关指针的分配和RAM的清另。RAM清另,保证了用户定义的变量初始为另,程序能可靠的从头执行。
这些高级语言平台在编译时嵌入的初始化程序可以不用,他们在使用手册中都有说明的。但一般用户不建议这样使用(包括我都不这样做),因为你必须具备了相当的能力以及对编译器有深入的了解后,才能保证不使用它的初始化程序,使用自己的初始化程序而不出现问题。
考虑RAM数据保护,一般用于掉电处理,要保护重要的数据,使系统再次运行时,能接前次状态继续。这是个有深度的功能设计,它包括硬件和软件两方面的配合。我认为,不管何种方式复位,MCU中RAM的数据都是不可靠的。一般采用的方法有:
1. 扩展外接采用带电池保护的RAM
2. 扩展外接铁电RAM
3. 利用EEPROM(有写入次数的限制,一般10万次,因此仅在必要前,如掉电前写入)
不管使用以上何种器件,还是不能安全的保护数据,如正在写入要保护的数据,是一组相关的,程序没写完整,掉电了,此时你的保护数据根本是无效的,不完整的!因此,还需要掉电予警电路(类似UPS),在我的“AVR串口多机通讯模式的问题”中的主机电路中,就是这样的设计。当然软件上还要有相应的处理方法配合。《M128》中也给出设计参考和思路。
不要认为我的电路、问题提的很“菜”,其实是有深度的,一般人忽视,或者根本没想到。甚至有些“单片机高手”,包括教这些内容的教师都不理解我在问什么,什么意思。
我给计算机专业的学生上课,问“什么是纯文本文件”,回答“TXT文件”。我说“OK!这个问题满分10分,你得1分。那么.C文件是不是?,将一个TXT文件改名成EXE文件后还是不是?你能不能给我一个专业的回答和说明?”。有人能全面回答这个问题,达到我10分的标准吗?
这就是我的教学、学习、工作理念。电子工程师:“0就是0,1就是1”。错一位,就给你好看。 我认为原楼主的本意是:
看门狗复位后,MCU从地址0重新开始运行,这样肯定会遇到和上电一样的问题...
C可能要作出响应的处理,有可能将部分"RAM 中的数据会清空",而非全部...
但他可惜掉电前的一些宝贵数据...
学生正在上班..."偷看一眼"...不知理解对否...
我是AVR菜鸟,虽然很苯,但很勤奋... 不管什么复位,MCU总是从0开始执行,执行初始化程序时,应该将RAM中数据全部清0。
要保护RAM中的重要数据,只能“抢”在复位前!如何“抢”,以及如何保存,加上程序初始化以后再如何执行(有的AVR中有复位标记寄存器,可以通过它检测到复位原因),就看你的实力了。 各位大哥,你们帮我看看这段汇编程序,为什么要判断是看门狗复位,还是上电复位呢?
芯片是用的m8 。其中user 是寄存器r25 里面存的是系统状态,这是一个电源管理的项目,
程序根据user的状态去执行相应的程序,比如说:当系统处于放电状态user=01; 当系统处于充电状态user=02。 在程序中当程序跑飞看门狗复位后,同样可以根据user的状态来执行相应的操作。 我最早问这个问题,就是想知道看门狗复位后user里面存的东西还在吗?
从这段我公司遗留下来的程序看,user里面存的数存在,不会被清空。
.org 0000h
rjmp reset
.
.
.org 0014h
reset: ldi a, high(ramend)
out sph, a
ldi a, low(ramend)
out spl, a
start: in a, mcucsr
sbrs a, 3
clr user ;user是一个寄存器 r25 存的是系统状态
clr a
out mcucsr, a 没人回帖, 我自己顶一下, 现在网站发贴的多了,不顶就掉下去了 马老师如此精妙的论断,竟然没人up吗?
平时不少朋友为此讨教、讨论,这里有清晰的答案,高明的老师,还不抓紧时间学习请教?
谢谢马老师的教导!
以前做过的项目中,虽然判断了狗复位,而不对某些IO口进行状态驱动,但是一般的变量全部重新初始化的。当时只感觉应该这样,却说不清楚为什么。现在算是基本弄明白了。有待继续研究!
再谢马老师的指点! 出于成本的考虑,一般应用中认为ram中的数据在复位后不会变,程序中判断标志位,如果不是上电,就不重新初始化数据
至于高级语言清零,可以重写启动文件 有几点不同意见:
1、“OK!当系统长时间断电后,一旦上电启动,RAM中的数据自然为“0””
正确的应该是MCU在初次上电后,RAM中的数据是随机的,并不肯定是0.
2、“要保护RAM中的重要数据,只能“抢”在复位前!”
正确的是应该是象6楼所讲的,重写启动过程,而不是抢在复位之前。
3、可以讲绝对多数的MCU在复位后(不管是何种复位),是不清除RAM中的内容的,只是清除或置位关系到MCU正常运行的一些寄存器。但有一点要注意,就是电源电压过低时,会造成RAM中数据的破坏。
-----此内容被mcu001于2005-01-01,15:04:15编辑过 补充一点:
4、马老师所讲的““首先看RAM的工作原理和用途。RAM储存数据的基本原理是电容(荷)冲电,冲满电状态表示“1”,放掉电表示“0”。它在MCU中的基本功能作为“临时工作数据”的存储器。(太简单了,这是学校学的最基本的理论了,可是大家为什么不从这个简单的原理入手分析呢?) ”
这应该是DRAM的工作原理,而不是一般MCU所使用的SRAM的工作原理吧,SRAM应该是是基于触发器结构的,在普通数字电路中都有讲的。 .
-----此内容被baplmqj于2005-02-15,13:35:30编辑过 我也想,不是马老师总结的不全面,就是文不对题,跑题了。
RAM的掉电保护和看门狗复位RAM的处理是不同的两个问题。
看门狗是为了程序跑飞和电压过低能自动恢复用的,在单片机工作时,大部分是受干扰跑飞。若真是掉电很长时间,与上电是没有区分的,程序从头执行,没有上电标志。若跑飞,则有上电标志,只是部分初始化。 顶起来 我使用ATMEGA128时,在按下复位键后,如果在它复位的同时立即按下按键有可能会产生整个系统复位,外部有串口通信,有定时器及串口中断处理找了很久,都没找到原因,而且MCUCSR在它复位后查看是全部为0,也就是查不出什么复位原因,我想问下老师,还会有什么原因造成这种复位呢? 不太明白,按下复位键(RESET脚接地),整个系统不就复位了吗?与其它键有何影响? 看门狗复位时,根本不知道它确切在什么时候复位!而一般编译器在复位后对数据都初始化了,但我们有的数据是不愿(比如一个计数NUM,当NUM计数到100时看门狗复位了此时NUM=0,那我前面计的100就没有意义了)被看门狗复位初始化掉的。所以需要有现在的初始化。比如在icc中让其不初始化变量,然后在程序中自己来初始化。刚开始学单片机刚遇到这样的操作,不知道理解对不对! 实际这个问题比较复杂,楼上的概念混淆了。
任何的复位都是芯片本身的功能,与编译器有和影响?你的“而一般编译器在复位后对数据都初始化了”是什么意思?
只要复位操作,芯片内的寄存器决大部分是硬件清零的。而RAM中的数据不变(上电复位除外)。
要保护复位前的数据,需要增加掉电保护等措施。 记号 看过 顶 呵呵~我的系统一旦复位,全部重新初始化内部SRAM数据
要保存的重要数据,全部都用外部SRAM,它带大电容,能在瞬间掉电也无妨
片内SRAM从来不觉得会有可靠的复位和掉电保护 好东西,现在用STM32,可以使用窗口看门狗+软件复位。不知道这个思路如何 mark mark
页:
[1]