打印

片外xram初始化的某些变量为什么不为0?

[复制链接]
3333|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2009-11-26 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xlsbz 于 2009-11-26 14:01 编辑

我用的keil的存储器模式Memory Model是XDATA模式。单片机的片上xram是4096字节(也就是0x0000~0x0FFF)

奇怪啊!!发现定义的很多变量都不是0,怎么办呢?
于是我将startup.a51的



XDATASTART      EQU     0     
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
;     <i> The length of XDATA memory in bytes.
XDATALEN        EQU     0x0FFF + 1  ;我修改了这里,默认值是0



于是我发现变量为0了,好高兴!终于搞定了!
但是在一个又返回值的函数里,我定义了一个两个字节长的变量,它的初始值竟然不是0

相当的纳闷啊!

多谢各位指点!

相关帖子

沙发
xlsbz|  楼主 | 2009-11-26 17:08 | 只看该作者
有人看,没人会?

使用特权

评论回复
板凳
desert_hawk| | 2009-11-26 18:18 | 只看该作者
是啊,这么强的一个问题,怎么就没人回答呢?:lol

使用特权

评论回复
地板
HWM| | 2009-11-26 18:28 | 只看该作者
函数中定义的变量可能被复用(覆盖),因此引用前必须赋值。

使用特权

评论回复
5
mohanwei| | 2009-11-26 18:51 | 只看该作者
变量定义之前一定要先赋值,否则是未知的

使用特权

评论回复
6
mohanwei| | 2009-11-26 18:51 | 只看该作者
打错了,“定义”应改为“引用”

使用特权

评论回复
7
xlsbz|  楼主 | 2009-11-26 20:46 | 只看该作者
用片子的128字节的ram时,也是用的startup清零的啊! 就没有遇到过这种情况!

用on——chip xram 怎么就有的不能清零呢? 奇了怪了!

看样子编译器还是不够厉害,不够完美啊!

使用特权

评论回复
8
xlsbz|  楼主 | 2010-7-27 22:08 | 只看该作者
???

现在也没有搞定这个问题 多谢指点

使用特权

评论回复
9
呆板书生| | 2010-7-28 07:22 | 只看该作者
C的规定里,本来就没有说变量开始的时候一定是0

如果要这样的话,两种方法

1.定义变量时添加初始值;  比如这样写 int K = 0;

2.修改startup.a51,这个是keil 提供的,但keil不知道你用多少XDATA,不可能无限地清零

使用特权

评论回复
10
ayb_ice| | 2010-7-28 08:37 | 只看该作者
还是去看C吧

使用特权

评论回复
11
大漠孤烟| | 2010-7-28 11:17 | 只看该作者
不管KEIL 的startup.a51里边怎么定义,最终你的程序所进行的所有操作都在编译出来目标文件和汇编文件当中,至于为啥不给你清0,你看看汇编里的操作就知道了。

使用特权

评论回复
12
xlsbz|  楼主 | 2011-4-21 00:13 | 只看该作者
C的规定里,本来就没有说变量开始的时候一定是0

如果要这样的话,两种方法

1.定义变量时添加初始值;  比如这样写 int K = 0;

2.修改startup.a51,这个是keil 提供的,但keil不知道你用多少XDATA,不可能无限地清 ...
呆板书生 发表于 2010-7-28 07:22


你没看到我程序里面全部清零了么  有多少我清多少

使用特权

评论回复
13
xlsbz|  楼主 | 2011-4-21 00:14 | 只看该作者
谁能答疑解惑  至今困惑

使用特权

评论回复
14
ejack| | 2011-4-21 07:55 | 只看该作者
但是在一个又返回值的函数里,我定义了一个两个字节长的变量,它的初始值竟然不是0


遇到这种奇怪问题先别急着**坛。
跟踪一下这个变量的地址先。

用片子的128字节的ram时,也是用的startup清零的啊! 就没有遇到过这种情况!

用on——chip xram 怎么就有的不能清零呢? 奇了怪了!

看样子编译器还是不够厉害,不够完美啊!

发牢骚之前先检查自己对startup的配置是否正确。编译器不是神仙,你不告诉它需要清零哪些块,难道它自己热心地帮你清零?顺便再帮忙把程序鞭一鞭、擦一擦?

使用特权

评论回复
15
ejack| | 2011-4-21 07:55 | 只看该作者
发 论 坛
**坛

……
这个世界太疯狂了……

使用特权

评论回复
16
xwj| | 2011-4-21 08:26 | 只看该作者
startup.a51只影响复位后的初始化,但不排之后再被别人更改的可能。

实际上就是执行这段代码:——很明显,只有复位时才会执行这一段从0弟子开始的代码。
                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP

STARTUP1:

IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF

使用特权

评论回复
17
sdpz| | 2011-4-21 08:32 | 只看该作者
这样清零没什么意义。偷懒只会让你的程序存在隐含BUG。

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝