搜索
bottom↓
回复: 19

介绍:让GCC不初始化SRAM的方法。这样当看门狗复位后,SRAM的值就不会被清除了。

[复制链接]

出0入0汤圆

发表于 2005-1-13 17:43:38 | 显示全部楼层 |阅读模式
(所有的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编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
头像被屏蔽

出0入0汤圆

发表于 2005-1-13 17:59:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2005-1-13 19:14:48 | 显示全部楼层
没什么的, 看到大家都那么耿直。得到 的同时也要 给别人点东西嘛,如果只得别人的,那论坛总有一天会变成“问坛”的。
-----此内容被zhonghua_li于2005-01-13,20:41:23编辑过
头像被屏蔽

出0入0汤圆

发表于 2005-1-13 19:48:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 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 code  PROGMEM //同__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;

}

出0入0汤圆

发表于 2005-1-13 22:32:53 | 显示全部楼层
4楼正点!支持!

出0入0汤圆

发表于 2005-1-13 22:43:48 | 显示全部楼层
死hotpower早不说话,绕的我不轻。
-----此内容被8515于2005-01-13,22:48:54编辑过

出0入0汤圆

发表于 2005-1-13 22:55:31 | 显示全部楼层
哈哈...我早就"暗示"--noinit....



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



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

出0入0汤圆

发表于 2005-1-13 23:10:23 | 显示全部楼层
死8515你冤枉了死hotpower...





有证据在此!!!



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



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





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



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



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



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



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


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

出0入0汤圆

 楼主| 发表于 2005-1-13 23:30:07 | 显示全部楼层
四楼不错,比我那个方法好多了,正式多了.

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


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

出0入0汤圆

发表于 2005-1-14 07:52:05 | 显示全部楼层
此帖并非针对楼主,实际上我也是AVR菜鸟...



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



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



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



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

出0入0汤圆

发表于 2005-1-14 13:17:20 | 显示全部楼层
5555......





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

出0入0汤圆

发表于 2005-1-14 13:38:56 | 显示全部楼层
hotpower 多谢!

出0入0汤圆

发表于 2005-6-14 22:13:16 | 显示全部楼层
我也正在学GCC,但只看了艺艺编写的PDF文档,对下面的

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



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

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

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

出0入0汤圆

发表于 2005-11-20 13:01:02 | 显示全部楼层
想学好GCCAVR的菜鸟们应该好好看看此帖...



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



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



希望阿莫整理一番...

出0入0汤圆

发表于 2006-7-30 14:00:51 | 显示全部楼层
在IAR中又如何处理呢?

出0入0汤圆

发表于 2006-7-31 15:10:00 | 显示全部楼层
知道了,声明变量时在前面加“__no_init”

出0入0汤圆

发表于 2011-10-8 11:10:40 | 显示全部楼层
回复【4楼】hotpower 菜农
-----------------------------------------------------------------------

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

__noinit__ unsigned int SystemRamTest;//

出0入0汤圆

发表于 2011-10-8 11:32:05 | 显示全部楼层
把宏定义放在分号前变量后。。。。。。
unsigned int SystemRamTest __noinit__;

出0入0汤圆

发表于 2014-2-26 21:29:45 来自手机 | 显示全部楼层
楼主好,我是做工控的,用stm32做的动作板,想实现看门狗复位或说软复位后动作开关能不受影响,就是原来开着的,看门狗复位后还是开着,高手们说可以修改启动代码让软复位不初始化RAM和寄存器,我不知怎么弄,请楼主赐教,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表