请问看门狗复位后,RAM 中的数据会清空吗?
是不是看门狗复位,和上电复位的效果是一样的呢? 我曾经听说有些人故意用看门狗复位来防止干扰,有这样的事吗?各位大哥请指点 单片机本身不会清除RAM中的数据。但C编译器在初始化程序中有执行清除RAM的指令,要通过特殊方法关闭。 HJJourAVR 大哥
你说的是不是每个程序经过c编译器后,都会生成清除RAM 的代码呢?
特殊方法具体是什么呢? 一般都有清除RAM的初始化指令。
但如何去关闭我不清楚,每个编译器都不一样,我的程序暂时没这个必要。 noinit It is only can be use. 方法也有几个...
-----此内容被hotpower于2004-12-07,12:14:49编辑过 说说好吗?谢谢hotpower大侠。 好像这个主题不太明确,有点晕... 就是上电如何不清空ram内容,比如有电池保存数据的,上电之后reset代码重新运行岂不是ram要被清空
是这样么?【其实我不大清楚】嘿嘿。
-----此内容被8515于2004-12-07,12:23:24编辑过 这是各种MCU中的C编译器必须具备的条件之一,而且是"龙头老大".
若无此功能,那么该C编译器必须被人们扔入垃圾堆里!!!!!!!!!!!!
先想想吧...否则教主又要说我误人子弟了...
有时候教人等于是害人...听说过"笑里藏刀"吧...
我的回复就是灌水,不一定那会灌出一滴油来...必须要"话里听话"才对...
吃饭了...我的<WinAVR菜鸟笔记>里有解答...可它现在在梦里...
先看明白这个例子再说,可惜不是AVR的...但也会有帮助的,至少在思维上是一致的.
说实话,这个主题求助说出了好些人的心里话,非常具有代表性,它是每个进入C的人们必须遇到过的...
-----此内容被hotpower于2004-12-07,12:46:07编辑过 晕菜了。。我是汇编盲。。
哦,大致理解了,要修改c编译出来的目标汇编代码?!
找到。。【什么啊】 非要汇编么? 那个persistent是什么啊? 肯定不让你用汇编一句...
向楼上多看几层,我基本上已给了"方法",不过确实有点晕菜!!!
"晕菜"一词我上网后才有些明白,但还是不太清楚...
只要找到与persistent雷同的功能,就揭开此谜了...
教主他知道... static?是吗
static int aa @0x60;
这样就不会冲掉内容了吗? 大侠我猜对了吗? 没试过,但绝对地址定义总不是C的原则... 现在告诉正解吧,楼主不知跑到那里去了???
#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)
{
//............................
} 楼猪用什么编译器阿?修改启动文件啦 我用的是icc 请大哥指点,如何修改启动文件? 如果用的是ICC AVR 的话,修改启动文件就是了. 给你链接
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=182362&bbs_page_no=1&bbs_id=1000 还是给你内容吧
首先打开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目录中覆盖原文件即可。 winavr在这方面做的非常出色... hotpower 老是在说winavr好, 大哥你能不能写一篇范例,告诉我们初学者如何“如何设置,如何建立工程项目,如何编译,如何仿真”请指点~~~~ to: biansf2001 花溅泪
大哥你说的第5行注释掉,是不是说把这句“rjmp init_loop”注释掉? 是用 “分号;” 还是用“//”来注释??你说“然后打开crtavr.s” 是用avrstudio打开吗?
-----此内容被jackiezeng于2004-12-28,14:11:01编辑过 哦。 我看到了,是用分号 我太菜了 jackiezeng,我说的是五行都注释掉
cpi R30,<__bss_end
cpc R31,R17
breq init_done
st Z+,R0
rjmp init_loop
这统统不要。 哈哈,ICCAVR要搞得如此复杂...看来不用ICCAVR这条路选对了... to biansf2001 花溅泪
大哥,你说的打开crtavr.s 文件, 是用什么东西打开?
然后打开crtavr.s文件,选择:file---compile file----startup file to object,然后把libsrc.lib目录里生成的crtavr.o拷贝到lib目录中覆盖原文件即可。 用ICC AVR 打开修改后保存也可以. 用iccavr阿打开。我说的都是用iccavr hotpower 能否说一下复位时winavr如何不使ram中数据清空 /*-------------------------------------------------------------------------------*/
#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不初始化 这是各种MCU中的C编译器必须具备的条件之一,而且是"龙头老大".
若无此功能,那么该C编译器必须被人们扔入垃圾堆里!!!!!!!!!!!!
不是吧老大!
HTC里面就没有这个功能!我感觉很好用的啊!其实一般RAM的我个人都感觉没有必要先清零! "一般RAM的我个人都感觉没有必要先清零"??
所有变量在使用前,必须先赋值。
否则会产生不确定的状态!!----因为上电时,SRAM的内容是随机的。
HT C是合泰吗,他可算不上大型MCU厂商,C编译器自然不会太严谨了。 mark mark MARK,学习了 不管是啥复位都是复位,效果是一样的
页:
[1]