搜索
bottom↓
回复: 27

关于“请问看门狗复位后,RAM 中的数据会清空吗?”的讨论

[复制链接]

出0入0汤圆

发表于 2004-12-29 14:40:07 | 显示全部楼层 |阅读模式
看到这个问题以及相关的回答,感到有必要做些说明。



   这个问题问的很含糊,关键是你要做什么?



   首先看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”。错一位,就给你好看。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2004-12-29 14:47:29 | 显示全部楼层
我认为原楼主的本意是:



看门狗复位后,MCU从地址0重新开始运行,这样肯定会遇到和上电一样的问题...

C可能要作出响应的处理,有可能将部分"RAM 中的数据会清空",而非全部...



但他可惜掉电前的一些宝贵数据...



学生正在上班..."偷看一眼"...不知理解对否...



我是AVR菜鸟,虽然很苯,但很勤奋...

出0入0汤圆

 楼主| 发表于 2004-12-29 15:17:26 | 显示全部楼层
不管什么复位,MCU总是从0开始执行,执行初始化程序时,应该将RAM中数据全部清0。



    要保护RAM中的重要数据,只能“抢”在复位前!如何“抢”,以及如何保存,加上程序初始化以后再如何执行(有的AVR中有复位标记寄存器,可以通过它检测到复位原因),就看你的实力了。

出0入0汤圆

发表于 2004-12-29 15:37:48 | 显示全部楼层
各位大哥,你们帮我看看这段汇编程序,为什么要判断是看门狗复位,还是上电复位呢?

芯片是用的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

出0入0汤圆

发表于 2004-12-29 21:44:17 | 显示全部楼层
没人回帖, 我自己顶一下, 现在网站发贴的多了,不顶就掉下去了

出0入0汤圆

发表于 2004-12-29 22:03:19 | 显示全部楼层
马老师如此精妙的论断,竟然没人up吗?

平时不少朋友为此讨教、讨论,这里有清晰的答案,高明的老师,还不抓紧时间学习请教?



谢谢马老师的教导!



以前做过的项目中,虽然判断了狗复位,而不对某些IO口进行状态驱动,但是一般的变量全部重新初始化的。当时只感觉应该这样,却说不清楚为什么。现在算是基本弄明白了。有待继续研究!



再谢马老师的指点!

出0入0汤圆

发表于 2004-12-29 22:16:48 | 显示全部楼层
出于成本的考虑,一般应用中认为ram中的数据在复位后不会变,程序中判断标志位,如果不是上电,就不重新初始化数据



至于高级语言清零,可以重写启动文件

出0入0汤圆

发表于 2005-1-1 14:48:44 | 显示全部楼层
有几点不同意见:

1、“OK!当系统长时间断电后,一旦上电启动,RAM中的数据自然为“0””

    正确的应该是MCU在初次上电后,RAM中的数据是随机的,并不肯定是0.

2、“要保护RAM中的重要数据,只能“抢”在复位前!”

    正确的是应该是象6楼所讲的,重写启动过程,而不是抢在复位之前。

3、可以讲绝对多数的MCU在复位后(不管是何种复位),是不清除RAM中的内容的,只是清除或置位关系到MCU正常运行的一些寄存器。但有一点要注意,就是电源电压过低时,会造成RAM中数据的破坏。
-----此内容被mcu001于2005-01-01,15:04:15编辑过

出0入0汤圆

发表于 2005-1-1 14:53:27 | 显示全部楼层
补充一点:

4、马老师所讲的““首先看RAM的工作原理和用途。RAM储存数据的基本原理是电容(荷)冲电,冲满电状态表示“1”,放掉电表示“0”。它在MCU中的基本功能作为“临时工作数据”的存储器。(太简单了,这是学校学的最基本的理论了,可是大家为什么不从这个简单的原理入手分析呢?) ”

   这应该是DRAM的工作原理,而不是一般MCU所使用的SRAM的工作原理吧,SRAM应该是是基于触发器结构的,在普通数字电路中都有讲的。

出0入0汤圆

发表于 2005-1-1 18:37:29 | 显示全部楼层
.
-----此内容被baplmqj于2005-02-15,13:35:30编辑过

出0入0汤圆

发表于 2005-2-13 14:34:59 | 显示全部楼层
我也想,不是马老师总结的不全面,就是文不对题,跑题了。

RAM的掉电保护和看门狗复位RAM的处理是不同的两个问题。

看门狗是为了程序跑飞和电压过低能自动恢复用的,在单片机工作时,大部分是受干扰跑飞。若真是掉电很长时间,与上电是没有区分的,程序从头执行,没有上电标志。若跑飞,则有上电标志,只是部分初始化。

出0入0汤圆

发表于 2005-11-21 20:58:58 | 显示全部楼层
顶起来

出0入0汤圆

发表于 2008-2-4 11:29:49 | 显示全部楼层
我使用ATMEGA128时,在按下复位键后,如果在它复位的同时立即按下按键有可能会产生整个系统复位,外部有串口通信,有定时器及串口中断处理找了很久,都没找到原因,而且MCUCSR在它复位后查看是全部为0,也就是查不出什么复位原因,我想问下老师,还会有什么原因造成这种复位呢?

出0入0汤圆

 楼主| 发表于 2008-2-4 18:23:59 | 显示全部楼层
不太明白,按下复位键(RESET脚接地),整个系统不就复位了吗?与其它键有何影响?

出0入0汤圆

发表于 2008-9-9 16:04:57 | 显示全部楼层
看门狗复位时,根本不知道它确切在什么时候复位!而一般编译器在复位后对数据都初始化了,但我们有的数据是不愿(比如一个计数NUM,当NUM计数到100时看门狗复位了此时NUM=0,那我前面计的100就没有意义了)被看门狗复位初始化掉的。所以需要有现在的初始化。比如在icc中让其不初始化变量,然后在程序中自己来初始化。刚开始学单片机刚遇到这样的操作,不知道理解对不对!

出0入0汤圆

 楼主| 发表于 2008-9-12 01:59:57 | 显示全部楼层
实际这个问题比较复杂,楼上的概念混淆了。

任何的复位都是芯片本身的功能,与编译器有和影响?你的“而一般编译器在复位后对数据都初始化了”是什么意思?

只要复位操作,芯片内的寄存器决大部分是硬件清零的。而RAM中的数据不变(上电复位除外)。

要保护复位前的数据,需要增加掉电保护等措施。

出0入0汤圆

发表于 2009-2-24 13:51:47 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-3-28 09:06:14 | 显示全部楼层
看过 顶

出0入0汤圆

发表于 2009-3-28 10:54:00 | 显示全部楼层
呵呵~我的系统一旦复位,全部重新初始化内部SRAM数据
要保存的重要数据,全部都用外部SRAM,它带大电容,能在瞬间掉电也无妨
片内SRAM从来不觉得会有可靠的复位和掉电保护

出0入0汤圆

发表于 2011-1-19 11:43:40 | 显示全部楼层
好东西,现在用STM32,可以使用窗口看门狗+软件复位。不知道这个思路如何

出0入0汤圆

发表于 2011-9-20 18:58:35 | 显示全部楼层
mark
头像被屏蔽

出0入0汤圆

发表于 2011-12-18 11:37:22 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 16:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表