搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2005-2-17 22:56:30 | 显示全部楼层 |阅读模式
来自liqu:

  “我也想,不是马老师总结的不全面,就是文不对题,跑题了。

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

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



   我在对这个问题回答时,首先讲到:这个问题问的很含糊,关键是你要做什么?

我认为liqu的“RAM的掉电保护和看门狗复位RAM的处理是不同的两个问题。”结论并不完全正确。从一般情况,或MCU的功能上讲,RAM的掉电保护和看门狗复位是处理不同的两个问题。但把这两个问题放在一起的话,他们就有联系了。



    考虑RAM数据的掉电保护,一般用于掉电处理,其目的是保护重要的运行数据,使系统再次启动运行时,能接前次状态继续,而不是从头开始(这里的头,不是指程序的头)。这是个有深度的功能设计,它包括硬件和软件两方面的配合。我认为,MCU不是以正常方式复位(指系统正常掉电后在上电),MCU中RAM的数据都是不可靠的。看门狗复位(程序跑飞)和低电压检测复位(突然掉电或电源波动)是随机的,你知道在看门狗复位前的一刻,跑飞的程序有无改写的RAM?系统的突然掉电或电源波动引起低电压检测复位时,RAM中关键的数据处理完了吗?尽管RAM有掉电保护,但其中的数据并不完整或正确,换句话说,RAM中数据是保护了,但保护的数据可能是不正确的。



    RAM数据的掉电保护,一般采用的方法有:

    1. 扩展外接采用带电池保护的RAM

    2. 扩展外接铁电RAM

    3. 利用EEPROM(有写入次数的限制,一般10万次,因此仅在必要前,如掉电前写入)



    不管使用以上何种器件,还是不能安全的保护数据。如程序正在写入RAM重要的数据,数据是一组相关的,但程序没写完整突然掉电了,此时你的保护数据根本是无效的,不完整的。因此,还需要掉电予警电路(类似UPS),在我的“AVR串口多机通讯模式的问题”中的主机电路中,就是这样的设计。当然软件上还要有相应的处理方法配合。《M128》中也给出设计参考和思路,如下:



    本小节给出一个使用片内E2PROM实现系统断电保护的应用设计实例。其主要功能为当系统掉电时,将系统运行的一些重要数据保存在片内的E2PROM中。系统再次上电后,读取E2PROM中的运行数据,从上次断电处继续运行。

    本系统程序运行的重要标志和数据共计有30个字节,这些数据不能在程序正常运行中写入E2PROM,这会很快使E2PROM失效,因为E2PROM的写入次数是有限的。因此,数据写入E2PROM的时间应该是在断电的前一刻。写入E2PROM一个字节的时间为8ms,那么写入30字节的时间约需要240ms。在硬件设计上就需要有一个掉电予检测电路,它能在掉电前的300ms通知MCU进行掉电保护处理,硬件电路见图。





                                  图 掉电予检测电路

       

    在图中9V电源通过极性保护二极管D1由模块7805稳压到5V提供系统电源。电源监控芯片IMP809-L的监控电压为4.6V,当R1、R2分压点的电压低于4.6V时,在R脚上产生低电平,使AVR进入INT0中断。稳压二极管D2的作用是保护IMP809-L。

    电路工作原理为:AVR设置BOD检测电压为2.7V,允许BOD,即系统电压掉到2.7V时AVR停止工作。当外部供电电压由9V跌落到7V时,7805已不能工作,AVR靠大电容C1的储能可以继续工作一段时间。此时R1、R2分压点的电压已降为4.6V,IMP809-L的R脚输出低电平,使AVR进入INT0中断,INT0的中断服务程序开始备份重要数据到E2PROM中。

    电路中储能电容C1的值应足够大,当IMP809-L在4.6V输出低电平时,要能够保证维持VCC的电压大于2.7V的时间超过300ms,使AVR有时间做紧急处理和备份数据。电容C2的值应合适,太大时会使掉电监测滞后,太小抗干扰性差。

    在INT0掉电保护中断服务程序中,应按以下的步骤和过程处理:

  1)紧急处理,关闭所有外部器件的工作,最大程度的减少系统对电源的消耗,如关闭LED显示等;

  2)备份重要数据到E2PROM中;

  3)循环检测INT0引脚是否为高电平。如为高电平则转到4执行;如果确实掉电,INT0电平一直为低,程序安全在此处终止;

  4)延时一段时间;

  5)再次检测INT0引脚电平。为低电平时转到3执行,再次循环检测;为高电平时执行6(表示电源受到干扰或短时掉电,现已经恢复正常);

  6)恢复外部器件工作;

  7)中断返回。



     需要说明的是:

1 本设计没有考虑程序跑飞,看门狗复位的情况,发生这种情况,系统只能从头开始工作。我的观点,你的系统经常程序跑飞,靠看门狗复位,那么RAM保护没有多大的意义,不是万无一失的。

2 MCU复位后,再次启动当然首先从程序的头步执行(ROM的0000H),初始化必要寄存器等,但接下来的运行就要看实际的需要了。

3 这个设计思想,我多次应用在实际的产品设计中,经过验证和实际使用是可靠的(针对掉电、包括突然掉电以及电源波动时数据的保护)。

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2005-2-17 23:06:36 | 显示全部楼层
自带小凳听马老师上课。。。



不过学生我也是将其放在首位的,否则决不选此MCU或其C编译器。。。



因为工控首要问题就是马老师的主题。

出0入0汤圆

发表于 2005-2-17 23:20:54 | 显示全部楼层
好像在大学里上课!

出0入0汤圆

发表于 2005-2-17 23:23:44 | 显示全部楼层
这个命题太重要



    RAM数据的掉电保护,一般采用的方法有:

    1. 扩展外接采用带电池保护的RAM

    2. 扩展外接铁电RAM

    3. 利用EEPROM(有写入次数的限制,一般10万次,因此仅在必要前,如掉电前写入)



    不管使用以上何种器件,还是不能安全的保护数据。如程序正在写入RAM重要的数据,数据是一组相关的,但程序没写完整突然掉电了,此时你的保护数据根本是无效的,不完整的。





在1.中我一般喜欢用法拉电容,当然RAM数据保护时间不长,但对3.有利。



说实话,这个命题太难。。。但我一般做得还可以。



我从来就认为此主题就是RAM掉电保护问题。而非什么RAM清空问题。



看门狗复位后,RAM 中的数据会清空也不会被清空,就看“拦截”要求了。

如果做不到就回家“卖豆腐”去吧。。。

出0入0汤圆

发表于 2005-2-18 03:30:49 | 显示全部楼层
求教:马老师说"写入E2PROM一个字节的时间为8ms,那么写入30字节的时间约需要240ms"

不知是否AVR的E2PROM有类似Page Write功能,可以节省写入时间。

出0入0汤圆

发表于 2005-2-18 09:18:29 | 显示全部楼层
“锁定”马老师的“行踪”太难了,想当他的学生更难。。。(无课程表与上课地点)

出0入0汤圆

发表于 2005-2-18 11:26:15 | 显示全部楼层
本论坛:  贴子主题:看大片,论单片机程序的坚固性。



电影给了我们一个新的思路:



程序在运行中,不断检查出现的小的异常情况,当异常情况累积到一定数量时,则保存重要的数据后由看门狗主动重启系统。系统在主动的重启后,根据保存的数据恢复运行状态。



当然,会有困难:在小系统上,我们很难准确的知道:什么时间重启系统为合适,什么时间为必须完全重启。



在论坛上也拜读关于:“看门狗复位后,RAM 中的数据会清空吗?”的讨论。



我认为答案应该是很明确的: 看门狗复位并不会改变RAM中的数据。

这是硬件常识:不管你是看门狗复位、手动复位还是BOD复位,只要RAM没断电, RAM中的数据就不会改变,除非有程序改写了它。

原问题问得很初级。



可能大家主要还是用C编程的偏多的原因吧?如果用汇编,应该就不会有这个问题,RAM中数据进不进行初始化受控于用户。



这是硬件常识:不管你是看门狗复位、手动复位还是BOD复位,只要RAM没断电, RAM中的数据就不会改变,除非有程序改写了它。

  

我发表菜论:

就是在C语言中也一样!!!我没加任何措施!前一段时间我调试我的系统,不管是看门狗复位、手动复位还是BOD复位,还有拔掉电源8分钟(有2000UF滤波电容)再通电前一次输入到RAM中的数据没有改变!!!

出0入0汤圆

发表于 2005-2-18 12:29:14 | 显示全部楼层
要是超过8分钟的,不能不管阿

出0入0汤圆

发表于 2005-4-11 10:49:05 | 显示全部楼层
baplmqj 菜菜的總結比馬老帥說明的來的直接了當!

出0入0汤圆

发表于 2005-4-11 13:43:08 | 显示全部楼层
baplmqj 菜菜:和马老师的观点相比,你忽略了一个问题,你并不知道复位时CPU在做什么,加入复位的时候CPU恰好在写某RAM,或者在写一个字的第一个字节后,第二字节还未写入,发生了复位,你能说不影响RAM的数值吗?我认为要想真正地解决问题是很难的,因为你无法预测何时发生复位,如果发生的事掉电,比较好办一些,发生了程序跑飞死机,由人工或看门狗复位,你又怎么知道在此之前程序是否物写了RAM?

出0入0汤圆

发表于 2005-4-11 19:13:58 | 显示全部楼层
经典~~~!值得借鉴~!

出0入0汤圆

发表于 2011-10-13 11:56:45 | 显示全部楼层
经典~~~!
头像被屏蔽

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 00:37

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

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