首先,这里的全局变量指的是 在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()里面,其他函数执行之前,再对全局变量初始化。
---对于 .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做的不完全是无用功... 全局变量还是少用为妙
相关推荐
一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM...而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零。如何设置非初始化数据变量不被零初始化,这是本篇文章所要探讨的。
在MDK(Keil)开发环境下,为了在单片机,如STM32,复位时保持变量的值不变,我们需要解决一个关键问题,即如何防止变量在复位时被自动初始化。通常,MDK会将全局变量和静态变量默认初始化为零。然而,根据项目需求...
一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM...而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零。如何设置非初始化数据变量不被零初始化,这是本篇文章所要探讨的。
然而,Keil MDK默认在复位时会清零所有非初始化变量,这与某些需求相悖。本文将介绍如何在Keil MDK环境下设置非零初始化变量,以满足特定的复位行为需求。 首先,我们需要理解代码和数据在内存中的组织方式。在ARM...
在KEIL中,配置全局变量在CPU复位后,无需初始化。
在Keil App的项目中,我们可以创建一个全局变量,例如: ```c int globalVar; // 全局变量,可以在任何函数中访问 ``` 然后在某个函数内部定义一个局部变量: ```c void func(void) { int localVar; // 局部变量...
11. **嵌入式系统设计**:结合实例,介绍如何使用Keil C进行嵌入式系统的设计,包括系统初始化、任务调度、中断处理等,帮助学习者具备实际项目开发能力。 通过《Keil C实例教程》的学习,不仅可以掌握Keil C编程...
2. 数据区初始化:初始化全局变量和静态变量,包括零初始化和非零初始化。 3. 外部RAM初始化:如果目标系统包含外部RAM,启动代码会对其进行初始化。 4. 堆栈初始化:设置堆栈指针SP的值。 5. 中断向量设置:将...
《Keil C251——深入理解与应用》 在嵌入式系统开发领域,Keil 工具链是不可或缺的一部分,尤其是对于基于80251微控制器的项目而言。"Keil C251.rar"是一个压缩包,包含了针对80251处理器的Keil集成开发环境(IDE)...
KEIL C251 V5.04是针对80C251系列单片机的集成开发环境,由德国Keil Software公司开发。这款软件是uVision4版本,是专业级的微控制器开发工具,广泛应用于嵌入式系统的设计与编程。 uVision4是KEIL的一个重要产品线...
KEIL C251 V504 Setup Keil C251 Version 5.04
根据给定的信息,本文将详细解释“结构体变量的初始化和使用”。首先,我们来了解一下结构体的基本概念、本例中的结构体定义及其初始化方法,随后深入探讨如何使用已定义的结构体变量。 ### 结构体基本概念 在C++...
Keil C学习教程是针对单片机开发人员的重要参考资料,主要涵盖了使用Keil C进行程序设计的各种技术要点和实践操作。Keil C是一款强大的微控制器开发工具,由Keil Software公司开发,广泛应用于嵌入式系统开发,尤其...
3. **μVision调试器**:这是KeilC51中的核心组件,支持源码级调试,通过设置断点、查看变量值、单步执行等功能,帮助开发者快速定位和解决问题。 4. **项目管理**:用户可以创建、组织和管理多个工程,每个工程...
7. **示例应用**:通过具体的实例,比如LED灯控制、串口通信、定时器应用等,来实践所学知识,加深对Keil C和微控制器编程的理解。 8. **错误与警告处理**:在编程过程中,你会遇到各种错误和警告。视频教学会解释...
KEIL C录象教程是专为单片机学习者设计的一系列教学资源,旨在帮助初学者和有经验的工程师深入理解和掌握使用KEIL C开发单片机应用的技能。KEIL C是一款强大的集成开发环境(IDE),广泛应用于微控制器编程,特别是...
注册机(KeilC) KeilC注册机 KeilC注册机
通过实例说明初始化对程序的影响。 有许多书上说,变量最好要赋初值。但是为什么要初值呢?不赋初值可能会出现什么样的意外呢?以下就我在以51单片机为MCU,Keil为编译器看到的实现现象作分析。
在 C89 标准中,结构体变量的初始化使用 {} 来实始化,而在 C99 版本中,则采用了可读性更强的标记化实始化。这种方式的优势就在于对结构体的初始化不必严格按照定义时的顺序。 例如,已知一个结构体变量 struct ...