介绍:让GCC不初始化SRAM的方法。这样当看门狗复位后,SRAM的值就不会被清除了。
(所有的C都会将变量默认初始化为零)。方法比较怪异。有点不足:C中的初始化变量无效。必需程序初始化。
(
char a = 10; //这样就无效了,因为没有执行初始化程序。
-----------------
char a;
a = 10; //必须这样,定义了之后另外用程序实现。
)
所有程序如下。
#include <avr/io.h>
void my_init4 (void) __attribute__ ((naked)) \
__attribute__ ((section (".init4")));
char x,y;
int main(void)
{
....... // your code!
return 0;
}
void my_init4 (void)
{
int temp;
temp = main();
}
-----此内容被zhonghua_li于2005-01-14,07:17:26编辑过 没什么的, 看到大家都那么耿直。得到 的同时也要 给别人点东西嘛,如果只得别人的,那论坛总有一天会变成“问坛”的。
-----此内容被zhonghua_li于2005-01-13,20:41:23编辑过 实际没必要这样复杂...
#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>
void (*reset)(void) = 0x0000;
/*-------------------------------------------------------------------------------*/
#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)
#define persistent__noinit__ //相当于PICC的persistent
#define codePROGMEM //同__flash__,变量定义在flash中,相当于Keil C51的code
/*--------------------------------------------------------------------------------*/
__noinit__ unsigned int SystemRamTest;//RAM不初始化
int main(void)
{
wdt_enable(WDTO_1S);//Watchdog 定时器1 秒超时
wdt_reset();
if (SystemRamTest != 0x55aa) {//内存被破坏或出厂设置
//........................................
SystemRamTest = 0x55aa;
}
sei();
//reset();
for(;;) {
_NOP();
}
return 0;
} 4楼正点!支持! 死hotpower早不说话,绕的我不轻。
-----此内容被8515于2005-01-13,22:48:54编辑过 哈哈...我早就"暗示"--noinit....
为何不多动动脑筋....
若不是害怕更多的人被...所以,"赶快出招"...以免伤及更多的百姓---阿莫可是第一个呀... 死8515你冤枉了死hotpower...
有证据在此!!!
请问看门狗复位后,RAM 中的数据会清空吗?
那个帖子的【16楼】现在告诉正解吧,楼主不知跑到那里去了???
死8515!!!还有什么话说???
不过看在你骂的不重的"情义"上,免费赠送一帖:我是AVR菜鸟我怕谁...
实际上,在以前这个帖子肯定会是21IC的AVR"酷帖",但我故意将标题写为<<我是AVR菜鸟我怕谁...>>
我不想穿什么裤子...在21IC我的裤子太多了,...但真正淹没的酷帖太多了...
只有能从水中滤油的人,才知道什么才叫"酷"!!!
-----此内容被hotpower于2005-01-13,23:35:29编辑过 四楼不错,比我那个方法好多了,正式多了.
看来我得把我的改一下了,免得误人了.
-----此内容被zhonghua_li于2005-01-14,07:18:33编辑过 此帖并非针对楼主,实际上我也是AVR菜鸟...
"误人"可能说得有些过,但肯定无"害人之心"...至少楼主已掌握了很多"非典"的东西...
"灌水入坛,传播非典"实乃我之本意...
"东戳一下西顶一下"是在站长的起哄下马潮老师给我的"赠语"...
所以,我依然是一只菜鸟,虽然我很菜,但我很勤奋... 5555......
我是AVR菜鸟我怕谁...哼。。 hotpower 多谢! 我也正在学GCC,但只看了艺艺编写的PDF文档,对下面的
define __noinit__ __attribute__ ((section (".noinit")))
void my_init4 (void) __attribute__ ((naked)) \
__attribute__ ((section (".init4")));
内容还有点搞不清,section( )括号中还有那些定义的关键字,干什么用的?希望DX们传授一些知识. 想学好GCCAVR的菜鸟们应该好好看看此帖...
此帖包含了很多有用(必用)的东西,这在以后的C++中也是离不了的.
51,PIC,430,AVR,ARM...等都可应用之...
希望阿莫整理一番... 在IAR中又如何处理呢? 知道了,声明变量时在前面加“__no_init” 回复【4楼】hotpower 菜农
-----------------------------------------------------------------------
您好!
请教一下 我用GCC这样定义不想初始化的变量,为什么编译器会报错啊,提示语法描述错误,我用的是WINAVR2005,谢谢。
QQ:553523543
#define __noinit__ __attribute__ ((section (".noinit"))) //变量不初始化
__noinit__ unsigned int SystemRamTest;// 把宏定义放在分号前变量后。。。。。。
unsigned int SystemRamTest __noinit__; 楼主好,我是做工控的,用stm32做的动作板,想实现看门狗复位或说软复位后动作开关能不受影响,就是原来开着的,看门狗复位后还是开着,高手们说可以修改启动代码让软复位不初始化RAM和寄存器,我不知怎么弄,请楼主赐教,谢谢
页:
[1]