jackiezeng 发表于 2004-12-6 22:29:24

请问看门狗复位后,RAM 中的数据会清空吗?

是不是看门狗复位,和上电复位的效果是一样的呢? 我曾经听说有些人故意用看门狗复位来防止干扰,有这样的事吗?各位大哥请指点

HJJourAVR 发表于 2004-12-6 22:36:35

单片机本身不会清除RAM中的数据。

但C编译器在初始化程序中有执行清除RAM的指令,要通过特殊方法关闭。

jackiezeng 发表于 2004-12-6 23:05:46

HJJourAVR 大哥

            

             你说的是不是每个程序经过c编译器后,都会生成清除RAM 的代码呢?

特殊方法具体是什么呢?

HJJourAVR 发表于 2004-12-6 23:17:06

一般都有清除RAM的初始化指令。

但如何去关闭我不清楚,每个编译器都不一样,我的程序暂时没这个必要。

hotpower 发表于 2004-12-7 00:14:41

noinit

8515 发表于 2004-12-7 11:54:04

It is only can be use.

hotpower 发表于 2004-12-7 12:13:47

方法也有几个...
-----此内容被hotpower于2004-12-07,12:14:49编辑过

8515 发表于 2004-12-7 12:14:57

说说好吗?谢谢hotpower大侠。

hotpower 发表于 2004-12-7 12:17:36

好像这个主题不太明确,有点晕...

8515 发表于 2004-12-7 12:20:54

就是上电如何不清空ram内容,比如有电池保存数据的,上电之后reset代码重新运行岂不是ram要被清空

是这样么?【其实我不大清楚】嘿嘿。
-----此内容被8515于2004-12-07,12:23:24编辑过

hotpower 发表于 2004-12-7 12:32:30

这是各种MCU中的C编译器必须具备的条件之一,而且是"龙头老大".



若无此功能,那么该C编译器必须被人们扔入垃圾堆里!!!!!!!!!!!!



先想想吧...否则教主又要说我误人子弟了...



有时候教人等于是害人...听说过"笑里藏刀"吧...



我的回复就是灌水,不一定那会灌出一滴油来...必须要"话里听话"才对...



吃饭了...我的<WinAVR菜鸟笔记>里有解答...可它现在在梦里...



先看明白这个例子再说,可惜不是AVR的...但也会有帮助的,至少在思维上是一致的.







说实话,这个主题求助说出了好些人的心里话,非常具有代表性,它是每个进入C的人们必须遇到过的...


-----此内容被hotpower于2004-12-07,12:46:07编辑过

8515 发表于 2004-12-7 12:48:07

晕菜了。。我是汇编盲。。



哦,大致理解了,要修改c编译出来的目标汇编代码?!



找到。。【什么啊】

8515 发表于 2004-12-7 12:48:58

非要汇编么? 那个persistent是什么啊?

hotpower 发表于 2004-12-7 12:55:01

肯定不让你用汇编一句...



向楼上多看几层,我基本上已给了"方法",不过确实有点晕菜!!!



"晕菜"一词我上网后才有些明白,但还是不太清楚...



只要找到与persistent雷同的功能,就揭开此谜了...



教主他知道...

8515 发表于 2004-12-7 13:44:53

static?是吗



static int aa @0x60;



这样就不会冲掉内容了吗? 大侠我猜对了吗?

hotpower 发表于 2004-12-7 13:56:41

没试过,但绝对地址定义总不是C的原则...

hotpower 发表于 2004-12-28 02:05:03

现在告诉正解吧,楼主不知跑到那里去了???



#define __noinit__ __attribute__ ((section (".noinit"))) //变量不初始化宏(被定义在.bss子段.noinit)





#include <inttypes.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/wdt.h>

#include <avr/ina90.h>

#include <avr/eeprom.h>

__noinit__ unsigned int SystemRamTest;//SystemRamTest不初始化



int main(void)

{

//wdt_enable(WDTO_1S);//Watchdog 定时器1 秒超时

//wdt_reset();

if (SystemRamTest != 0x55aa) {//内存被破坏

//...................................

    SystemRamTest = 0x55aa;

}

else {//内存未被破坏

//...................................

}

//.................

sei();

for(;;) {

    _NOP();

}

return 0;

}



SIGNAL(SIG_XXXXXXXXXXX)

{

//............................

}

biansf2001 发表于 2004-12-28 09:21:44

楼猪用什么编译器阿?修改启动文件啦

jackiezeng 发表于 2004-12-28 10:16:26

我用的是icc 请大哥指点,如何修改启动文件?

dengchongguang 发表于 2004-12-28 10:16:43

如果用的是ICC AVR 的话,修改启动文件就是了.

biansf2001 发表于 2004-12-28 11:57:37

给你链接



http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=182362&bbs_page_no=1&bbs_id=1000

biansf2001 发表于 2004-12-28 11:59:04

还是给你内容吧



首先打开libsrc.avr目录的init.s文件,找到以下

; this loop zeros out all the data in the bss area

;

init_loop:

   cpi R30,<__bss_end

   cpc R31,R17

   breq init_done

   st Z+,R0

   rjmp init_loop

init_done:

这几句就是清ram的。把中间五行注释掉,标号不注释是为了防止别的调用找不到。然后打开crtavr.s文件,选择:file---compile file----startup file to object,然后把libsrc.lib目录里生成的crtavr.o拷贝到lib目录中覆盖原文件即可。

hotpower 发表于 2004-12-28 12:52:25

winavr在这方面做的非常出色...

jackiezeng 发表于 2004-12-28 14:00:28

hotpower 老是在说winavr好, 大哥你能不能写一篇范例,告诉我们初学者如何“如何设置,如何建立工程项目,如何编译,如何仿真”请指点~~~~

jackiezeng 发表于 2004-12-28 14:07:13

to: biansf2001 花溅泪

                     

                   大哥你说的第5行注释掉,是不是说把这句“rjmp init_loop”注释掉? 是用 “分号;” 还是用“//”来注释??你说“然后打开crtavr.s” 是用avrstudio打开吗?
-----此内容被jackiezeng于2004-12-28,14:11:01编辑过

jackiezeng 发表于 2004-12-28 14:08:06

哦。 我看到了,是用分号      我太菜了

biansf2001 发表于 2004-12-28 14:50:03

jackiezeng,我说的是五行都注释掉

   cpi R30,<__bss_end

   cpc R31,R17

   breq init_done

   st Z+,R0

   rjmp init_loop

这统统不要。

hotpower 发表于 2004-12-28 21:47:17

哈哈,ICCAVR要搞得如此复杂...看来不用ICCAVR这条路选对了...

jackiezeng 发表于 2004-12-29 09:18:28

to biansf2001 花溅泪



                   大哥,你说的打开crtavr.s 文件, 是用什么东西打开?

然后打开crtavr.s文件,选择:file---compile file----startup file to object,然后把libsrc.lib目录里生成的crtavr.o拷贝到lib目录中覆盖原文件即可。

dengchongguang 发表于 2004-12-29 11:24:31

用ICC AVR 打开修改后保存也可以.

biansf2001 发表于 2004-12-29 12:06:09

用iccavr阿打开。我说的都是用iccavr

lt0166 发表于 2005-8-14 21:40:51

hotpower 能否说一下复位时winavr如何不使ram中数据清空

hotpower 发表于 2005-12-1 23:19:10

/*-------------------------------------------------------------------------------*/

#define __noinit__ __attribute__ ((section (".noinit"))) //变量不初始化

#define __eeprom__ __attribute__ ((section (".eeprom"))) //变量定义在eeprom中



#define __flash__PROGMEM //变量定义在flash中(写法1)

//#define __flash____attribute__ ((section (".progmem"))) //变量定义在flash中(写法2)

//#define __flash____attribute__ ((progmem)) //变量定义在flash中(写法3)

//prg_uchar等



#define persistent__noinit__ //变量不初始化,相当于PICC的persistent

#define codePROGMEM //同__flash__,变量定义在flash中,相当于Keil C51的code

/*-------------------------------------------------------------------------------*/





__noinit__ unsigned int SystemRamTest;//RAM不初始化

our_avr 发表于 2005-12-30 17:16:34

这是各种MCU中的C编译器必须具备的条件之一,而且是"龙头老大".



若无此功能,那么该C编译器必须被人们扔入垃圾堆里!!!!!!!!!!!!



不是吧老大!

HTC里面就没有这个功能!我感觉很好用的啊!其实一般RAM的我个人都感觉没有必要先清零!

HJJourAVR 发表于 2005-12-30 17:33:22

"一般RAM的我个人都感觉没有必要先清零"??



所有变量在使用前,必须先赋值。

否则会产生不确定的状态!!----因为上电时,SRAM的内容是随机的。



HT C是合泰吗,他可算不上大型MCU厂商,C编译器自然不会太严谨了。

xiaokangkang 发表于 2008-4-10 23:43:30

mark

cxque 发表于 2011-9-14 21:30:00

mark

sinxcosytana 发表于 2014-2-19 21:30:03

MARK,学习了

鹰击长空 发表于 2014-2-19 23:16:57

不管是啥复位都是复位,效果是一样的
页: [1]
查看完整版本: 请问看门狗复位后,RAM 中的数据会清空吗?