打印
[ZLG-ARM]

如何修改Startup.s,能在启动时不清零RAM?

[复制链接]
1894|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlhlg|  楼主 | 2007-2-1 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用keil for ARM开发的LPC21XX,启动时把RAM中的所有变量都清零了。当看门狗动作时,也把所有变量清零了。这样就存在很大问题:虽然由于看门狗,机器不死机了,但看门狗动作前的中间结果全丢失了。请问高人,如何修改Startup.s,能在启动时不清零RAM? 

相关帖子

沙发
zlgARM| | 2007-2-2 09:31 | 只看该作者

RE

跟STARTUP.s没关系。
如果你用到了全局变量(或在main()函数的开头定义有),而且定义的同时赋有初值,那么变量的初始化操作实际上在进入main()函数之前就已经完成了。这是C编译器的特性,同时也是其它C编译器所共有的、ANSI C所要求的。
所以要从设置编译器入手。
在KEIL的option for target的target菜单里,有针对各RAM区域初始化与否的设置。注意一下NOInit的钩选框。

使用特权

评论回复
板凳
tlhlg|  楼主 | 2007-2-3 17:31 | 只看该作者

谢谢

使用特权

评论回复
地板
tlhlg|  楼主 | 2007-2-3 17:32 | 只看该作者

谢谢

非常谢谢2楼的回答.现在情况是这样的,Startup.s结尾处的程序如下:

...
// Enter the C code
                LDR     R0,=?C?INIT
                TST     R0,#1       ; Bit-0 set: INIT is Thumb
                LDREQ   LR,=exit?A  ; ARM Mode
                LDRNE   LR,=exit?T  ; Thumb Mode
                BX      R0
                ENDP

PUBLIC exit?A
exit?A          PROC    CODE32
                B       exit?A  //****
                ENDP

PUBLIC exit?T
exit?T          PROC    CODE16
exit:           B       exit?T
                ENDP
                END


用单拍跟踪,在 //**** 处转去处理:1,清零所有定义的全局变量;2,转向c的main.
实际上若能修改相应语句,直接转向到c的main也就行了。但我找不到转向c的main的语句。ADS用的语句keil不适用。

使用特权

评论回复
5
hotpower| | 2007-2-4 02:37 | 只看该作者

应该不是noinit就能搞定的~~~

NOInit的钩选框
#define __noinit__ __attribute__((zero_init))//变量不初始化为0
__noinit__ volatile unsigned int SystemRamTest;//RAM不初始化
  if (::SystemRamTest != SystemRamTestVal) {
//................................
  }
  else {
//................................
  }
相关链接:http://hotpower.21ic.org/user1/46/archives/2006/10198.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝