产品概述

51单片机堆栈区 单片机地址空间,堆栈理解

小编 2024-10-06 产品概述 23 0

单片机地址空间,堆栈理解

data –可寻址片内ram 0x00-0x7f

bdata—可位寻址片内ram

idata—可寻址片内ram,允许访问全部内部ram 0x00-0xff

padata—分页寻址访问片外ram

xdata—可寻址片外ram 0x0000- 0xffff

code--程序存储区单片机存储器分ROM跟RAM之分,RAM存放中间结果,数据和经常变换的代码,ROM存放code。51单片机采用的是哈弗结构,即数据跟代码拥有单独的地址空间。存储器可以分为程序存储器(eerom,flash之类),内部数据存储器(ram),SFR,位地址空间和外部数据存储器。内部数据存储器在物理上分为内部SRAM和特殊功能寄存器,而内部分为低(0x00-0x7f)和(0x80-0xff),高128字节地址重复,需要不同的访问方式。SFR用直接寻址方式,SRAM需要间接。这里SFR是寄存器,硬件上是中央处理器的内部组成部分,访问速度很快。在低128B的SRAM,0x00-0x1f是4个通用工作寄存器,每组有R0-R7。使用哪一组,可以通过PSW中的RS1,RS0来配置。位寻址是在0x20-0x2f

程序内存可以分为几个区,栈区(stack),堆区(Heap),全局区(static),文字常亮区,程序代码区。程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。栈是从高到低分配,堆是从低到高分配。我们一般说的堆栈指的栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间,C51函数调用通过R0-R7和栈来实现。

为什么单片机启动时,不需要用bootloader将代码从ROM搬移到RAM,而ARM则需要。这里我们可以先看看单片机程序执行的过程,单片机执行分三个步骤,取执行---分析指令----执行指令。取指令的任务是:根据PC的值从程序存储器读出指令,送到指令寄存器。然后分析执行执行。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据。要知道RAM取数的速度是远高于ROM的,但是单片机因为本身运行频率不高,所以从ROM取指令慢并不影响。而ARM不同,cpu运行的频率高,远大于从ROM读写的速度,所以一般有操作系统,都需要将代码部分拷贝到RAM中再执行。

Keil C51堆栈理论计算

Keil C51堆栈理论计算 一、 概述 C51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。因此,堆栈区必须留够,宁可大一些,但是具体要预留多大的空间,必须先计算出用户需要堆栈的大小。 一般有两种计算方法: a. 通过内置堆栈计算函数进行实际计算(有计算方案); b. 通过堆栈理论计算(本文主要介绍的内容); 图1 编译结果图 Data空间256个字节,目前已经使用167.3个字节,剩余88.7字节,是否够用?如何进行判断?堆栈区到底留多大才算足够呢? C51程序设计中,用户需要堆栈的大小可以从普通子函数和中断子程序的嵌套层数来计算。 二、中断程序函数嵌套调用 1:中断函数使用堆栈理论最大压栈计算: 方式一:大家最普遍常用的方式:不指定寄存器组,如下图2; 图2 不指定寄存器组 在中断发生时,保存中断子程序的返回地址PC指针需要2个字节。中断发生后,在中断子程序中系统会自动进行如下操作:将ACC、B、DPH、DPL、PSW、R0~R7共13个寄存器压栈。加上中断返回地址,中断的堆栈需求为15个字节。 方式二:使用专用的寄存器组,如下图3; 图3 专用寄存器组 中断发生时,保存中断子程序的返回地址PC指针需要2个字节。中断发生后,在中断子程序中系统会自动进行如下操作:将ACC、B、DPH、DPL、PSW共5个寄存器压栈。中断的堆栈需求为7个字节。 如果中断中调用了子程序,每一层嵌套要加PC指针2Bytes。 最复杂的情况,如果中断有优先级不一样的情况,芯片支持中断抢占式响应,即存在中断程序嵌套,则需要用优先级等级个数乘以(单个中断的堆栈需求+中断嵌套堆栈需求)。 2:普通子函数堆栈理论计算: 普通子函数的调用比较简单,每次调用时就是将函数的返回地址保存在堆栈中,这个地址占两个字节。函数嵌套调用时,从最内层的子函数算起,总的堆栈需求字节数为嵌套的层数乘以2。 三、m51文件中查看堆栈预留大小空间 工程编译后查看对应.m51文件说明,如下参考堆栈指针SP起始地址。 堆栈预留大小是:0xFF-0xa8=87Bytes。 图3 m51文件 四、总结 通过计算程序中中断及普通子函数理论使用的最大堆栈空间N,再通过.m51文件查看剩余的堆栈空间M,两者相比较,必须保证M ≥N,才能确保堆栈空间不会溢出。如果实际测试到M略小于N,则可实际计算堆栈空间需求,以保证程序正常运行。

相关问答

什么是 堆栈 ?堆栈指针的SP的作用是什么?8051单片机堆栈容量不超过多少字节?

堆栈:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和...

8051单片机 堆栈 读取规则?

1.8051单片机的堆栈读取规则是按照先进后出的原则进行的。2.堆栈是一种用于存储临时数据的内存区域,它的特点是后进先出。在8051单片机中,堆栈是由两个寄存...

数据总线是位.14、89C 51单片机 有个16位可编程定时器/计数...

[最佳回答]13、51系列单片机地址总线是16位,数据总线是8位.14、89C51单片机有2个16位可编程定时器/计数器,有4种工作方式.15、80C51单片机片内ROM的容...

执行中断返回指令后,从 堆栈区 弹出的地址送给什么寄存器?

以51系列单片机为例,RETI中断返回:从堆栈栈顶弹出的两个字节内容(即断点地址)送至程序指针寄存器PC以51系列单片机为例,RETI中断返回:从堆栈栈顶弹出的两...

单片机 题目一套7.中断查询确认后,在下列各种8031 单片机 运...

[最佳回答]7.中断查询确认后,在下列各种8031单片机运行情况中,能立即进行响应的是:(D)A.当前正在执行高优先级中断处理B.当前正在执行RETI指令C.当前指令...

51单片机 push和pop怎么操作?

51单片机push入栈操作有两个步骤,首先定义堆栈指针SP,然后再执行push指令。入栈操作的注意事项是所压数据并不是存入SP指针指示的地址,而是SP+1单元。pop操作...

这样置于对 51 系列 单片机 所有的型号都对吗?为何?-ZOL问答

1指令MOVSP#ODFH是将栈底设置在片内RAM中的DFH单元,这样设置只有对52子系列的单片机才适合。堆栈范围是0E0H~0FFH.2因为只有52子系列的单片机(如at89c5.....

AT89S 51单片机 的内部数据存储器分为哪几个区及其使用特点?

大致可分为三个区域:00H~1FH为四组工作寄存器组(R0~R7),任何时刻单片机只使用其中1组,在中断等服务中指定使用和当前不一样的寄存器组,有利于快速现场保...

51单片机 的中断源 和中断入口?

51单片机的中断源就是指能够打断当前顺序执行的功能模块,比如外部中断事件源,定时器中断事件源,通讯模块数据发送接收中断源等。中断入口是指打断当前顺序执行...

堆栈 是什么概念?

在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在...

猜你喜欢