Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1054700
  • 博文数量: 178
  • 博客积分: 10222
  • 博客等级: 上将
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-03 11:27
个人简介

有所追求

文章分类

全部博文(178)

文章存档

2012年(1)

2011年(5)

2010年(3)

2009年(78)

2008年(91)

我的朋友

分类:

2009-03-24 17:56:49

谢谢您的推荐   

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


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

阅读(7819) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~