|
转载
这个问题问的很含糊,关键是你要做什么?
首先看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就是