原创 KeilC 里面慎重对全局变量初始化

2009-12-3 07:33 5785 12 15 分类: MCU/ 嵌入式

首先,这里的全局变量指的是 main() 之前定义的变量(包括在 .h文件 或者  其他.c文件里面定义的变量)。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


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


 


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


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


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


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


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


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


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


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


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


---对于 .h 或者其他 ,c文件里面的全局变量,也要如此处理。


======== 呵呵 当然,汇编高手可以完全不管这个东西 ====


=============================================================


=============================================================


刚翻出来看 INIT.A51 文件,一切谜团揭晓~~  下面的内容摘自该文件说明:


 INIT.A51:  This code is executed, if the application program contains
;             initialized variables at file level.


;  User-defined Watch-Dog Refresh.
;
;  If the C application contains many initialized variables uses a watchdog
;  it might be possible that the user has to include a watchdog refresh into
;  the initialization process. The watchdog refresh routine can be included
;  in the following MACRO and can alter all CPU registers except
;  DPTR.
;
WATCHDOG        MACRO
                                ; Include any Watchdog refresh code here
                ENDM


------------------


看来keilC做的不完全是无用功... 全局变量还是少用为妙

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户433198 2013-12-20 09:58

还是有点迷糊

用户377235 2013-9-29 08:53

太谢谢博主的提示了,终于可以省下一些重要的code空间

用户1432715 2011-8-26 10:21

还是不明白,使用了初始化的全局变量的话,缺点在哪里?
相关推荐阅读
用户1528688 2014-10-19 10:55
【博客大赛】汽车电子的容错处理
汽车电子的容错处理随着新能源汽车的逐步上路,车上EMC状况将是一个巨大挑战。软硬件方面都应采取一定的措施提高系统容错性能。下面是笔者的一些经验整理,希望能起到抛砖引玉之作用。  在实验室验证原型的时...
用户1528688 2014-09-08 00:14
背景任务的几种常见调度方式
背景任务的几种常见调度方式   我们喜欢RTOS,因为它足够简单;我们讨厌RTOS,因为它足够复杂。从“裸奔”到RTOS,首先意味着工程师们要去适应这些“新”东西,更要命的是要去给BOSS...
用户1528688 2014-08-18 21:20
工程师应要会讲故事
    是的,我回来了,EDN博客(...好吧,其实没人记得我)     5年之前我还在念书,自认为是那种无师自通的材料,于是乎——大一白天疯玩,晚上熬夜做作业;大二开始沉迷code,以至于去...
用户1528688 2009-11-28 23:03
C51外部RAM扩展
//存储模式的选择(small,compect,large),并不直接影响XDATA的使用 -- //使用XDATA,PDATA时,主要注意的是 //参数传递,堆栈的位置--因为这些直接影响到程序的效...
用户1528688 2009-11-28 21:53
特定序列检测
从数据流<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  010_01101_0_...
EE直播间
更多
我要评论
3
12
关闭 站长推荐上一条 /3 下一条