家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生 家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生
当前位置: 电脑硬件维修培训网单片机技术Cx51程序设计的堆栈空间计算方法
文章内容

Cx51程序设计的堆栈空间计算方法

作者:佚名  来源:本站整理  发布时间:2011-06-15 10:27:48

      引言

  用C语言什么是C语言?C语言

  C语言是目前世界上流行、使用最广泛的高级程序设计语言。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。

进行MCS51系列单片机什么是单片机?单片机

  单片机是单片微型计算机(Single-Chip Microcomputer)的简称,是一种将中心处理器微处理器随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)采纳超大规模集成电路技术集成到一块硅片上构成的微型计算机系统。 [全文]

程序设计是单片机什么是单片机?单片机

  单片机是单片微型计算机(Single-Chip Microcomputer)的简称,是一种将中心处理器微处理器随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)采纳超大规模集成电路技术集成到一块硅片上构成的微型计算机系统。

开发和应用的必定趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机什么是51单片机?51单片机

  51单片机是单片机中的一种,单片机(single-chip microcomputer)是一块集成芯片,但不是一块实现某一个逻辑功能的芯片,而是在这块芯片当中,集成了一个计算机系统。如中心处理器(微处理器)、存储器(ROM,RAM)、I/O接口、定时器/计数器、中断系统等。中心处理器是单片机的核心单元,他由运算器和操纵器组成,他的主要功能是实现算术运算、逻辑运算、和操纵。 [全文]

上的扩展,既有C语言的共性,又有它自己的特点。本文介绍的是Cx51程序设计时堆栈的计算方法。

  1堆栈的溢出问题

  MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。堆栈区留得太大,会减少其他数据的存放空间,留得太少则很轻易溢出。所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的非凡功能寄存器(SFR)中或者堆栈外的数据区中。非凡功能寄存器的内容影响系统的状态,数据区的内容又很轻易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。因此,堆栈区必须留够,宁可大一些。要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。要求M≥N,下面分别分析这两个问题。

  2计算系统

  分配给用户的堆栈大小Cx51程序设计中,因为动态局部变量是长驻内存什么是内存?内存

  内存的正式叫法是内存储器,以此来与外存储器区分开。物理上它安装在计算机内部,通常安装在主板上,所以称为内存。它的作用是供临时存储处理器需要处理的数据或处理后的结果,可见内存是计算机处理器的工作空间。它是处理器运行的程序和数据必须驻留于其中的一个临时存储区域,是计算机十分重要的部件。 [全文]

中的,实际上相当于局部静态变量,即使在函数调用结束时也不释放空间(这一点不同于标准C语言)。Cx51编译器按照用户的设置,将所有的变量存放在片内和片外的RAM中。片内变量分配好空间后,将剩下的空间全部作为堆栈空间,这个空间是最大可能的堆栈空间。当然,因为Cx51是一种可以访问寄存器的C语言(非凡功能寄存器),因此可在程序中访问SP,将堆栈空间设置得小一点。不过,一般没有人这么做。本文只是讨论放在片内RAM的变量。我们把变量分为两种情况:

  ① 用作函数的参数和函数返回值的局部变量。这种变量尽量在寄存器组中存放。为了讨论方便,假设统一用寄存器组0,具体的地址为0x00~0x07。最多可以传递3个参数,假如参数的个数比较多,就将多余的参数放到内存什么是内存?内存

  内存的正式叫法是内存储器,以此来与外存储器区分开。物理上它安装在计算机内部,通常安装在主板上,所以称为内存。它的作用是供临时存储处理器需要处理的数据或处理后的结果,可见内存是计算机处理器的工作空间。它是处理器运行的程序和数据必须驻留于其中的一个临时存储区域,是计算机十分重要的部件。

(0x08以后的地址)中存放。这里,假设每个函数的参数都不大于3个。

  ② 我们在程序中定义的全局变量,以及不是用作函数的参数和函数返回值的局部变量。以上两种变量在内存中0x08地址以后存放,存放完毕后将堆栈指针SP指向分配了变量的片内RAM的最后一个字节。因为MCS51单片机什么是51单片机?51单片机

  51单片机是单片机中的一种,单片机(single-chip microcomputer)是一块集成芯片,但不是一块实现某一个逻辑功能的芯片,而是在这块芯片当中,集成了一个计算机系统。如中心处理器(微处理器)、存储器(ROM,RAM)、I/O接口、定时器/计数器、中断系统等。中心处理器是单片机的核心单元,他由运算器和操纵器组成,他的主要功能是实现算术运算、逻辑运算、和操纵。

的堆栈是一种满递增堆栈且堆栈的宽度为8位,所以在需要压栈操作时将堆栈指针先加1,后入栈有效内容。有了以上规则,就可以精确地计算出系统分配给用户的堆栈空间。以求两个数的最大公约数和最小公倍数的函数为例,代码如下:

  #include <REG52.H>

  unsigned char max(unsigned char a, unsigned char b);

  unsigned char min(unsigned char a, unsigned char b);

  unsigned char M;

  void main (void) {

  unsigned char n;

  M = max(12, 9);

  n = min(12, 9);

  }

  unsigned char max(unsigned char a, unsigned char b){

  while(a != b) {

  if(a > b)

  a = a - b;

  else

  b = b - a;

  }

  return a;

  }

  unsigned char min(unsigned char a, unsigned char b){

  unsigned char k;

  k = a*b/M;

  return k;

  }

  这段程序中资源的分配情况如下:一个全变量M(无符号字符型)存放最大公约数;主函数中定义一个局部变量n(无符号字符型)存放最小公倍数;求最大公约数的函数unsigned char max(unsigned char a, unsigned char b),有两个参数a和b;求最小公倍数的函数unsigned char min(unsigned char a, unsigned char b),有两个参数a和b,并且定义了一个变量k存放函数的返回值。可以由此计算出系统分配给变量的空间。函数的参数和返回值在工作寄存器组中存放,所以不占用0x08地址以后的空间。系统只给变量M和变量n分配存储空间,这两个变量占两个字节(地址为0x08和0x09),则堆栈指针SP应该指向0x09。Cx51系统编译后生成代码的系统资源占用情况如下:全局变量M的地址为0x08,n的地址为0x09,SP的值为0x09。这与我们的计算结果相符。

  3计算用户需要堆栈的大小

  堆栈区到底留多大才算足够呢? Cx51程序设计中,用户需要堆栈的大小可以从一般子函数和中断子程序的嵌套层数来计算。一般子函数的调用比较简洁,每次调用时就是将函数的返回地址保存在堆栈中,这个地址占两个字节。函数嵌套调用时,从最内层的子函数算起,总的堆栈需求字节数为嵌套的层数乘以2。中断子程序的堆栈需求分为两种情况:

  ① 中断子程序使用中断产生前的寄存器组。在中断产生时,保存中断子程序的返回地址需要2个字节。中断产生后,在中断子程序中系统会自动进行如下操作:将ACC、B、DPH、DPL、PSW、R0~R7共13个寄存器压栈。加上中断返回地址,中断的堆栈需求为15个字节。

  ② 中断子程序使用自己专用的寄存器组。这种情况下不需要保存R0~R7的内容,可以减少堆栈需求,其他的内容仍需要压栈守护。中断产生时,保存中断子程序的返回地址需要2个字节。中断产生后,在中断子程序中系统会自动进行如下操作:将ACC、B、DPH、DPL、PSW共5个寄存器压栈。加上、中断返回地址,这种堆栈的需求为7个字节。但是这种情况应该注重:假如中断子程序中调用子函数,且函数需要参数和返回值,则被调用的子函数和中断子程序要使用相同的寄存器组,否则会出现不可预料的后果。以一个温度测试系统为例。系统采纳8051作为处理器,温度信号在A/D转换结束后通过外部中断0提醒单片机接收处理。定时中断0作为监控程序,中断周期为20 ms。温度信号可以自动测试(每秒一次)或者手动测试(按测试键后测试),这两种测试方法可以通过操纵键切换。中断子程序和一般子函数的嵌套情况为:在定时中断程序中调用显示子程序,外部中断0内部没有函数调用。部分程序如下:

  void int0(void) interrupt 0 using 1 {

  读取转换数据;

  数据处理;

  }

  void time0 (void) interrupt 1 {

  计数值重装;

  读键;

  按键处理;

  leddisp(adat);//显示

  }

  void main (void) {

  相关数据初始化和数码显示自检;

  外部中断和定时器什么是定时器?定时器

  定时器是装有时段或时刻操纵机构的开关装置。它有一个频率稳定的振荡源,通过齿轮传动或集成电路分频计数,当将时间累加到预置数值时,或指示到预置的时刻处,定时器即发送信号操纵执行机构。 [全文]

初始化设置;

  单片机休眠;

  }

  void leddisp(unsigned char *pt) {

  用串口什么是串口?串口

  串口是计算机上一种非常通用的设备通信协议,大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备的通信协议,并可用于猎取远程采集设备的数据。 [全文]

工作方式0发送显示数据,并经过74LS164转换后静态显示;

  }

  接下来分析这段程序的最大堆栈需求。假设定时器什么是定时器?定时器

  定时器是装有时段或时刻操纵机构的开关装置。它有一个频率稳定的振荡源,通过齿轮传动或集成电路分频计数,当将时间累加到预置数值时,或指示到预置的时刻处,定时器即发送信号操纵执行机构。

0中断时,调用了显示函数void leddisp(unsigned char *pt),在调用显示函数时A/D转换结束产生了外部中断0的中断。这时应该是程序对堆栈的最大需求,堆栈的大小是:定时器0(15字节)+显示函数(2字节)+外部中断0(7字节)=24字节。

  结语

  通过精确的计算编译系统分配给用户的堆栈空间和用户自己最大的堆栈需求,不仅能从根本上解决堆栈溢出的问题,还可以很好地安排单片机比较紧张的资源。此外,通过在片内存储器什么是存储器?存储器

  存储器是用来存储程序和数据的部件,有了存储器,计算机才有记忆功能,才能保证正常工作。它根据操纵器指定的位置存进和取出信息。 [全文]

存放适量局部变量,还可以有效地提高软件的执行速度。



  来源:兔巴哥

该文章来至网络或用户,仅供学习交流之用,版权归原作者所有。
如有侵权,请及时与我们联系!现在联系我们

AT89C51单片机在LED显示屏操纵电路设计中的应用

LED显示屏又叫电子显示屏,是由LED点阵组成,通过红色或绿色灯珠的亮灭来显示文字、图片、动画、视频,内容可以随时换掉,通常由显示模块、操纵系统及电源系统组成。显示模...

基于P89LPC932单片机的夫兰克-赫兹

1 引言  夫兰克-赫兹实验是近代物理中非常重要的实验,在一定条件下(主要是一定的第一栅极电压UG1K、阻滞电压UG2P、灯丝电压UF),通过研究阳极电流IP随第二栅极电压UG2...

一种基于单片机的数字频率计的实现

摘要:设计一种以单片机AT89C51为核心的数字频率计,介绍了单片机、数字译码和显示单元的组成及工作原理。测试时,将被测输入信号送给单片机,通过程序操纵计数,结果送译码...

基于PIC单片机的LED点阵手写屏设计

概述  本文采纳PIC 16F877A单片机为主要核心操纵元件,设计了一个32×32 LED点阵模块的书写显示屏。它主要由光笔模块和点阵显示模块组成,光笔模块利用光敏电阻的光电特...

Small RTOS51实现基于8位单片机的温控器设计

目前,8位单片机在测控领域和智能化电子产品应用中仍占有重要地位.而应用嵌入式实时操作系统(ERTOS)会对8位单片机的软件开发带来极大方便。在此简要介绍嵌入式实时操作系统...

在线报名
友情链接