单片机编译器中局部变量和全局变量的深入解析

发布者:Lihua1314520最新更新时间:2015-09-18 来源: eefocus关键字:单片机  编译器  局部变量  全局变量 手机看文章 扫描二维码
随时随地手机看文章
通常我们都是学了标准c语言教程后从事单片机c语言的编写的, 那就先要明白一点, 标准c语言实际上是起源于pc平台上的一种语言, 标准c语言肯定是不会照顾到单片机的特殊性的. 因此单片机c编译器中的c语言是一种基于标准c,但是又有相应修改扩充的扩展c语言.  所以在单片机c编译器里写程序时一定要了解单片机编译器扩展c语言的不同之处, 绝不能死板地照搬标准c.

      在标准c里, 局部变量是函数在调用的时候才临时分配存储空间的,全局变量是程序整个生命周期都一直存在的.  不过要知道,临时分配存储空间是需要操作系统内存管理程序支持的, 单片机中通常都没有操作系统,也就不能实现像pc平台中那样的局部变量的空间分配.  这里就需要深入了解一下单片机的c编译器究竟是如何处理局部变量的,如果对此没有概念,碰到调试过程中的一些奇异现象恐怕只能觉匪夷所思了.

      另外需要知道的一点是, 不同的编译器对于局部变量的处理方法也不一样, 不能学了一个就到处照搬. 这里拿KEIL C ,IARAVR, ICCAVR这个三个编译器做分析比较.

 

     

       首先说 Keil C51 , 它的局部变量并不是在堆栈中, C51 为了提高代码的效率, 根据 51 处理器的特性. 编译器对函数局部变量的安排进行了处理.局部变量如果不能分配到 寄存器里, 就放在 RAM 中了.编译器通过覆盖分析, 可以共享局部变量的地址空间.。 最终的DATA使用量取决于调用链中那个使用DATA最多的链。所以,在程序中增加一个局部变量,如果不是位于那个使用DATA最多的链中,需要的DATA数量是有可能不会增加的。

      如:main()->f11()->f12()->f13().... // 链1
              |----->f21()->f22()->f23().... // 链2

      因为f11(),f21()不在同一个调用链上,显然,f11()中使用的局部变量,可以和f21()中的局部变量,使用同一个存储单元。因为它们中的任何一个处在生命期内的话,另一个必然已经离开它的生命周期,同时它的局部变量也离开了它的生命周期,这些局部变量所占用的存储单元当然可以另做它用了。
      假设链1目前的局部变量需要50个存储单元,链2需要40个存储单元。那么你在链2中加入不多于10个单元的局部变量的话,程序最终需要的存储单元数量是不会增加的。

       再说ICCAVR ,  它把局部变量存放在软件堆栈空间中.  ICCAVR使用两个堆栈:一个用于子程序调用和中断操作的硬件堆栈,一个用于传递参数、临时变量和局部变量的软件堆栈。硬件堆栈是从数据内存的顶部开始分配的,在硬件堆栈下面再分配一定数量的字节作为软件堆栈。

       IARAVR对于局部变量的处理方法与ICCAVR一样. 它也有两个堆栈,一个是data stack ,一个是return address stack.  分别用于存放临时变量,局部变量,传递参数, 和函数返回地址.

       这里需要注意的是, 局部变量存放在堆栈中的处理方式一定要保证堆栈足够大, 特别是定义了局部数组变量的情况下,一旦数组过大,超过了堆栈大小就会发生堆栈溢出,  如果只是读取数据还好, 一旦写入数据,就会破坏堆栈空间以外的数据, 导致程序时常.

关键字:单片机  编译器  局部变量  全局变量 引用地址:单片机编译器中局部变量和全局变量的深入解析

上一篇:堆栈溢出总结
下一篇:单片机c语言中菜单系统源码分析

推荐阅读最新更新时间:2024-03-16 14:32

51单片机与计算机进行通信的实现方法
51单片机 与计算机 通信 首先我们先来了解一下51单片机与计算机进行通信的实现方法。先来看一个实现这个功能的基本电路。 图中的P1就是 仿真 用的一个串口 接口 ,这个仿真电路要实现与计算机通信功能需要用到其他两个软件,一个是虚拟串口驱动软件,另外一个是串口助手软件,这两个软件在网上都很容易找到。我使用的是Virtual Serial Port Driver和丁丁串口助手,你也可以使用自己熟悉的软件,如果找不到或使用,安装这两个软件有问题可以私信。 虚拟串口驱动软件安装后配置两个成对的虚拟串口一个对应仿真电路中的串口接口,一个对应在串口助手软件上,这样就相当于将两个软件通过虚拟串口连接在一起了,将他们配置成相同的串口
[单片机]
51<font color='red'>单片机</font>与计算机进行通信的实现方法
单片机驱动蜂鸣器C51程序
#include reg51.h #include intrins.h #include absacc.h #define uchar unsigned char #define uint unsigned int sbit k1=P1^4; //按钮1 sbit k2=P1^5; //按钮2 sbit beep=P3^7; //接蜂鸣器 /********************************************************* 本程序出自http://www.51hei.com会员uiesers的辛勤劳动,作用是驱动蜂鸣器发出声音,蜂鸣器接在单片机的p1.5口,由两个按钮控制.p1.4开,p
[单片机]
Cortex-M单片机下载数据到外部flash
主机环境:Windows 10 64bit 开发环境:MDK 5.23 目标板:LPC54114 之前在NXP社区得到一块LPC54114的板卡,是由万利制作的,LPC54114是一款双核MCU,包含了一颗M4主核和一颗M0+从核,利用该板卡学习了一下双核MCU的开发流程,板卡中提供了一颗W25P80FLASH,之前拥有的板卡都没有挂外部FLASH,刚好之前利用LPC54608学习TouchGFX时可以把图片资源下载到外部FLASH中,因此借此机会来学习一下如何把数据下载到外部FLASH。 平时烧录代码我们都是烧录到MCU内部的FLASH中,如下图: 可以看到下载的时片上256KB的FLASH,该算法文件是由DFP包提供的,具
[单片机]
学51单片机-搞定矩阵键盘
矩阵按键貌似是学51单片机里面必备的一课,现在基本所有的51开发板都带这部分电路。因为它用8个IO口实现了16个按键的扫描检测,实现了IO口更充分的利用。 扫描矩阵按键的程序说简单也简单,说复杂也复杂。说它简单,是因为现在网络太发达了,随便搜索一下,都能找到可以直接用的源码。说它复杂,是因为如果不借助网络,全凭自己去摸索,确实要花一部分时间。 我当时是性子比较倔,只在网上看了矩阵按键的原理,没有看参考代码,完全凭借自己的理解,写了一段矩阵按键的扫描程序,花了三天时间才调试通。那三天,真的是折腾的死去活来,但是当程序调好的时候,真的感觉自己还是很拉风的。 这里,不是让大家学我那样去闭门造车,因为太
[单片机]
学51<font color='red'>单片机</font>-搞定矩阵键盘
一种基于低功耗单片机的抗干扰电源
  引 言   近年来,各种低功耗单片机在各类仪表中得到了广泛应用,特别是89C51/2单片机以其优良的性能、低廉的价格和标准的降低功耗特性以及片内存储器的快速可擦写性等赢得了广大用户。但各种测试仪表常常要求能方便地携带使用,因此仪表电源常采用专用电瓶。一般专用电瓶电压为12V(或12V 串联组成) ,而以89C51/2单片机组成的应用系统其电源电压Vcc要求在5×(1±0.1)V 范围内,有些仪表使用环境常常较恶劣,干扰因素较多。因此,要使单片机系统可靠工作,一套抗干扰能力强的供电电路显得十分重要。   1  抗干扰电源电路设计与分析    抗干扰电源电路由两部分组成,如图1 所示。以MAX638 为中心组成直流降压电路,
[单片机]
C语言实现51单片机中的PID算法
//pid.h #ifndef __PID__ #define __PID__ /*PID = Uk + KP* +KI*E(k)+KD* ;(增量型PID算式) 函数入口: RK(设定值),CK(实际值),KP,KI,KD 函数出口: U(K)*/ typedef struct PIDValue { int8 KP; int8 KI; int8 KD; int8 F; int8 BITMOV; int EK ; int UK; int RK; int CK; int UK_REAL; }pid_str; //PIDValueStr PID; void pid_exe(pid_str *PID) ; #
[单片机]
单片机小调查之洗衣机
空调分为室内和室外两个部分,其制冷原理:蒸发器中的低温液态制冷剂吸收周围热量,使室内空气降温,而制冷剂气化为低压气体;室外压缩机将低压气态制冷剂压缩为高压高温的过热蒸汽后排至冷凝器,其热量被室外空气带走,制冷剂凝结为高压液体,经过节流毛细管降压降温后流回蒸发器。室内外空气如此反复循环流动,达到室内降温的目的。 制热原理:是令制冷剂的流向发生改变,使其在室内冷凝放热,在室外蒸发吸热。而空调中制冷剂的流动方向是通过四通阀来控制的。 下面将介绍利用 SPMC65P2408A 单片机实现的定频空调机主控板方案。 SPMC65P2408A是由凌阳公司设计开发的8位工业级单片机,采用凌阳SPMC65内核,支持位操
[单片机]
<font color='red'>单片机</font>小调查之洗衣机
基于AT89C51和DS18B20的最简温度测量系统
l引 言 温度的测量和控制在激光器、光纤光栅的使用及其他的工农业生产和科学研究中应用广泛。温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结之类的模拟温度传感器。信号经取样、放大后通过模数转换,再交自单片机处理。被测温度信号从温敏元件到单片机,经过众多器件,易受干扰、不易控制且精度不高。因此,本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 2温度测量系统硬件 系统结构图如图1所示 。这里通过上拉电阻直
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved