zhonghua_li 发表于 2005-1-13 17:43:38

介绍:让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编辑过

armok 发表于 2005-1-13 17:59:10

zhonghua_li 发表于 2005-1-13 19:14:48

没什么的, 看到大家都那么耿直。得到 的同时也要 给别人点东西嘛,如果只得别人的,那论坛总有一天会变成“问坛”的。
-----此内容被zhonghua_li于2005-01-13,20:41:23编辑过

armok 发表于 2005-1-13 19:48:27

hotpower 发表于 2005-1-13 21:17:01

实际没必要这样复杂...



#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;

}

cock 发表于 2005-1-13 22:32:53

4楼正点!支持!

8515 发表于 2005-1-13 22:43:48

死hotpower早不说话,绕的我不轻。
-----此内容被8515于2005-01-13,22:48:54编辑过

hotpower 发表于 2005-1-13 22:55:31

哈哈...我早就"暗示"--noinit....



为何不多动动脑筋....



若不是害怕更多的人被...所以,"赶快出招"...以免伤及更多的百姓---阿莫可是第一个呀...

hotpower 发表于 2005-1-13 23:10:23

死8515你冤枉了死hotpower...





有证据在此!!!



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



那个帖子的【16楼】现在告诉正解吧,楼主不知跑到那里去了???





死8515!!!还有什么话说???



不过看在你骂的不重的"情义"上,免费赠送一帖:我是AVR菜鸟我怕谁...



实际上,在以前这个帖子肯定会是21IC的AVR"酷帖",但我故意将标题写为<<我是AVR菜鸟我怕谁...>>



我不想穿什么裤子...在21IC我的裤子太多了,...但真正淹没的酷帖太多了...



只有能从水中滤油的人,才知道什么才叫"酷"!!!


-----此内容被hotpower于2005-01-13,23:35:29编辑过

zhonghua_li 发表于 2005-1-13 23:30:07

四楼不错,比我那个方法好多了,正式多了.

看来我得把我的改一下了,免得误人了.


-----此内容被zhonghua_li于2005-01-14,07:18:33编辑过

hotpower 发表于 2005-1-14 07:52:05

此帖并非针对楼主,实际上我也是AVR菜鸟...



"误人"可能说得有些过,但肯定无"害人之心"...至少楼主已掌握了很多"非典"的东西...



"灌水入坛,传播非典"实乃我之本意...



"东戳一下西顶一下"是在站长的起哄下马潮老师给我的"赠语"...



所以,我依然是一只菜鸟,虽然我很菜,但我很勤奋...

8515 发表于 2005-1-14 13:17:20

5555......





我是AVR菜鸟我怕谁...哼。。

testcode 发表于 2005-1-14 13:38:56

hotpower 多谢!

bucker 发表于 2005-6-14 22:13:16

我也正在学GCC,但只看了艺艺编写的PDF文档,对下面的

define __noinit__ __attribute__ ((section (".noinit")))



void my_init4 (void) __attribute__ ((naked)) \

    __attribute__ ((section (".init4")));

内容还有点搞不清,section(   )括号中还有那些定义的关键字,干什么用的?希望DX们传授一些知识.

hotpower 发表于 2005-11-20 13:01:02

想学好GCCAVR的菜鸟们应该好好看看此帖...



此帖包含了很多有用(必用)的东西,这在以后的C++中也是离不了的.



51,PIC,430,AVR,ARM...等都可应用之...



希望阿莫整理一番...

xswok 发表于 2006-7-30 14:00:51

在IAR中又如何处理呢?

xswok 发表于 2006-7-31 15:10:00

知道了,声明变量时在前面加“__no_init”

azqx 发表于 2011-10-8 11:10:40

回复【4楼】hotpower 菜农
-----------------------------------------------------------------------

您好!
请教一下 我用GCC这样定义不想初始化的变量,为什么编译器会报错啊,提示语法描述错误,我用的是WINAVR2005,谢谢。
QQ:553523543
#define __noinit__ __attribute__ ((section (".noinit"))) //变量不初始化

__noinit__ unsigned int SystemRamTest;//

musheng123 发表于 2011-10-8 11:32:05

把宏定义放在分号前变量后。。。。。。
unsigned int SystemRamTest __noinit__;

爱则倾心 发表于 2014-2-26 21:29:45

楼主好,我是做工控的,用stm32做的动作板,想实现看门狗复位或说软复位后动作开关能不受影响,就是原来开着的,看门狗复位后还是开着,高手们说可以修改启动代码让软复位不初始化RAM和寄存器,我不知怎么弄,请楼主赐教,谢谢
页: [1]
查看完整版本: 介绍:让GCC不初始化SRAM的方法。这样当看门狗复位后,SRAM的值就不会被清除了。