搜索
bottom↓
回复: 25

全局变量这样初始化为什么错

[复制链接]

出0入0汤圆

发表于 2010-4-1 17:32:24 | 显示全部楼层 |阅读模式
定义一个大一些的数组 如 unsigned char xdata buf[200]={0};   //0
就不能正常运行代码 keil自己初始化完 连我第一句写的光狗都不支行

但我定义成unsigned char xdata buf[200]; 不赋值就没问题

这是为什么啊?

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-4-1 17:36:11 | 显示全部楼层
unsigned char xdata buf[200]={0};

出0入0汤圆

发表于 2010-4-1 17:37:10 | 显示全部楼层
楼主,,数组赋值能这样吗?
这样试试
unsigned char xdata buf[200]={0};
这样就把200个元素赋0了

出0入0汤圆

 楼主| 发表于 2010-4-1 17:37:27 | 显示全部楼层
楼上 一样 ={0} 也不行

出0入0汤圆

 楼主| 发表于 2010-4-1 17:37:48 | 显示全部楼层
【已解决。初始化时间太长 ,看门狗默认开,没关。问题非以下描述】




首先,这里的全局变量指的是 在main() 之前定义的变量(包括在 .h文件 或者 其他.c文件里面定义的变量)。

    假设没有加入startup.a51 文件(即使加入了,还是有这个问题),如果全局变量在定义的时候,没有被初始化。那么,实际生产的汇编代码 会是以下这样的流程:

                从0000H开始(这里一般是一条跳转语句),然后执行对内部RAM的清零工作;而后,设置堆栈指针SP(系统上电的时候 SP="07H",但是编译之后,由于全局变量的影响,清零内部RAM之后,SP的位置不一定是SP);再然后,PC指针直接转去执行main()。


                如果全局变量被初始化了,则生成的汇编代码是以下的情形:

从0000H开始(这里一般是一条跳转语句),然后执行对内部RAM的清零工作;而后,设置堆栈指针SP(系统上电的时候 SP="07H",但是编译之后,由于全局变量的影响,清零内部RAM之后,SP的位置不一定是SP);然后,PC指针并没有转去main()!                ----UV2,UV3 都是这个情况。

而是转去执行一大堆指令(被初始化的全局变量越多,这堆指令越长…指令看上去与init.a51这个文件有关—但是工程里并没有包含这个文件!无语…),最后才转去执行main().

------ 试图从这堆“冗余”的指令去看出点名堂,发现 里面居然有MOVC 这样的指令,似乎是在对某操作码进行运算…百思不得其解。

------### 暂且阁下这个事。

为了找回这些被莫名其妙就占去的code空间,可以使用下面的方法:

在main()外面,只声明变量,绝不初始化。

----注:类似sbit P1_0 = P1^0; 的语句不会引起这样的问题。

等到了main()里面,其他函数执行之前,再对全局变量初始化。

出0入0汤圆

 楼主| 发表于 2010-4-1 17:38:21 | 显示全部楼层
KeilC 里面慎重对全局变量初始化(转载)

刚网上查了下。找到些资料

出0入0汤圆

发表于 2010-4-1 17:52:02 | 显示全部楼层
把错误提示帖出来。。

出0入0汤圆

 楼主| 发表于 2010-4-1 17:57:45 | 显示全部楼层
没有错误提示, 编译通过没任何警告。

出0入0汤圆

发表于 2010-4-1 17:58:09 | 显示全部楼层
你查的资料似乎也不对,根本原因是初始化的时间过长,超过了看门狗的时间,初始化完成以后才能进入main函数,这时关狗已经来不及了,这时要修改startup.a51(记得把它加入复制到工程而不是修改系统的),在第一条指令前加入关狗的指令,在main函数里再开(如果需要的话)。

出0入0汤圆

 楼主| 发表于 2010-4-1 17:59:25 | 显示全部楼层
谢谢! 9楼 我马上验证下 C8051F是 默认开狗的

出0入0汤圆

发表于 2010-4-1 18:03:24 | 显示全部楼层
startup.a51修改的部分,红色的 ,我用的是C8051F410

?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP

STARTUP1:

                MOV                0D9H,#00h  ; 关开门狗
IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

出0入0汤圆

 楼主| 发表于 2010-4-1 18:06:01 | 显示全部楼层
shark.我试了下 确实如你所说。 谢谢

出0入0汤圆

发表于 2010-12-22 22:22:24 | 显示全部楼层
good!

出0入0汤圆

发表于 2011-1-6 09:27:02 | 显示全部楼层
呵呵,学习了,都是不错的经验!

出0入0汤圆

发表于 2011-1-6 11:07:28 | 显示全部楼层
囧,看来我功力差好多
没看懂。。。。
貌似遇到过类似的问题
不知道是不是这个原因
就是赋值位置不同
(编译都能过)
程序有的可以跑
有的跑不动

出0入0汤圆

发表于 2011-3-11 00:53:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-11 02:07:27 | 显示全部楼层
在这里不得不抱怨,Keil的编译器还存在古老的C规范....

出0入0汤圆

发表于 2011-3-16 14:23:34 | 显示全部楼层
回复【11楼】shark  
-----------------------------------------------------------------------

帮我大忙了,第二次栽在f410的看门狗上了

出0入0汤圆

发表于 2011-3-16 15:19:26 | 显示全部楼层
又学习了一招,3Q

出0入0汤圆

发表于 2011-11-2 14:59:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-6-29 22:28:55 | 显示全部楼层
是这个问题,正解,LZ稿,高

出0入0汤圆

发表于 2015-1-31 14:45:06 | 显示全部楼层
好腻害,mark

出0入8汤圆

发表于 2015-1-31 15:23:47 | 显示全部楼层
初始化一个数组才需要多久呀?加了初始化所用的时间后,看门狗就来不及复位了,似乎从侧面反应出看门狗计时时间设定的太短了吧?
即便是来得及喂狗,在main()中执行时,由于种种原因会不会导致来不及喂狗。。。。。

出0入0汤圆

发表于 2015-2-1 08:28:24 来自手机 | 显示全部楼层
学习了,顶一个

出0入0汤圆

发表于 2015-2-1 09:18:02 | 显示全部楼层
我也遇到这样的问题过,怎么解决的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 12:53

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

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