采纳答案是错误的。
keil,不会自动安排堆栈的。
堆栈空间的大小,必须由编程者自己来控制。
堆栈深度,也没有默认值。
堆栈深度是多少,这要根据你的程序而定。
尽管51可以通过栈 *** 作的方式传递变量,但在通过C语言编译产生的代码当中,压栈和出栈 *** 作更多的是用于保护 *** 作,防止子程序调用造成一些寄存器的误修改。而局部变量则尽可能使用访问速度最快的或执行代码最少的内部RAM,比如工作寄存器R0~R7等。
堆栈一般是汇编语言编程时需要考虑的问题,在C语言里可以不考虑堆栈,编译器会根据情况做优化,设定堆栈的起始地址和大小。另外需要说明一下:至少在51中堆栈与RAM不是独立的两个部件,堆栈空间包含于直接寻址的内部RAM中,其它的CPU我不了解,就不敢说了。
其实内部RAM及外部RAM都可以用于保存局部变量:
1、内部直接寻址RAM(data):地址0x00H->0x7F的内部RAM,长度128字节
2、内部间接寻址RAM(idata):地址0x80H->0xFF的内部RAM,长度128字节
3、可位寻址RAM(bdata):地址0x20H->0x3F的内部RAM,长度16字节
4、外部RAM(xdata):标准空间地址0X0000-->0XFFFF
5、及按页访问的外部RAM(pdata):一般用的不多。
软件编程人员可以根据具体要求声明变量的存储类型进而确定使用哪个区域,或者在编译选项中选择数据存储模式。如果不做特殊声明,只要资源够用,一般编译器都会自动优化选择访问速度最快的直接寻址内部RAM(也就是0x00->0X7F范围内的RAM)。
问题一:什么叫做堆栈? 堆和栈是两个不同的概念。 堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。 堆栈是一种执行“后进先出”算法的数据结构。 设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。 堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入――push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“d出pop”。如此就实现了后进先出的原则。 而堆栈寄存器就是存放堆栈的寄存器。
问题二:堆栈是什么概念 堆栈是一个在内存中开辟的 用于存放数据的空间
它的扩展方向是从内存的大地址向小地址扩展
用于存放函数调用时候的参数传递
static变量存放在程序的静态内存区。是在程序的后面最靠近前端的地方
问题三:什么是堆栈及堆栈的作用是什么 堆栈是小说中常用的人物塑造方法,通常是为一个小人物所用。举个例子,某剑客非常之吊,被称为天下无敌。可是,一个小人物在与他正面的斗争中,不用任何手段就击败了他,表现出他惊人的实力。这就是对这个小人物的堆栈,为的就是把他通过别人巨大实力的转换成这个人物的威望。这就是堆栈
问题四:古代什么叫堆栈 供贮存物品之用的建筑。《诗经・小雅》有“乃求千斯仓”句,可知仓库建筑源远流长。现代仓库更多地考虑经营上的收益而不仅为了贮存。这是同旧式仓库的区别所在。因此,现代仓库从运输周转、贮存方式和建筑设施上都重视通道的合理布置,货物的分布方式和堆积的最大高度,并配置经济有效的机械化、自动化存取设施,以提高贮存能力和工作效率。
仓库由贮存物品的库房、运输传送设施(如吊车、电梯、滑梯等)、出入库房的输送管道和设备以及消防设施、管理用房等组成。仓库按所贮存物品的形态可分为贮存固体物品的、液体物品的、气体物品的和粉状物品的仓库;按贮存物品的性质可分为贮存原材料的、半成品的和成品的仓库;按建筑形式可分为单层仓库、多层仓库、圆筒形仓库。
单层仓库 适于贮存金属材料、建筑材料、矿石、机械产品、 车辆、 油类、化工原料、木材及其制品等。水运码头仓库、铁路运输仓库、航空运输仓库多用单层建筑,以加快装卸速度。单层仓库的总平面设计要求道路贯通,装运的汽车、铲车能直接进出仓库。这种仓库一般采用预制钢筋混凝土结构,柱网一般为6米,跨度为12米、15米、18米、24米、30米、36米不等。地面堆货荷载大的仓库,跨度宜大。库内吊车的起重能力根据贮存货物单件的最大重量确定。起重量在 5吨以下的可用单梁式吊车或单轨葫芦,大于5吨的用桥式吊车。仓库要求防潮。如供贮存易燃品之用,应采用柔性地面层防止产生火花。屋面和墙面均应不渗水、不漏水。
多层仓库 一般贮存百货、电子器材、食品、橡胶产品、药品、医疗器械、化学制品、文化用品、仪器仪表等。底层应有卸货装货场地,装卸车辆可直接进入。货物的垂直运输一般采用15~5吨的运货电梯。应考虑装运货手推车或铲车能开入电梯间内,以加快装卸速度。多层仓库常用滑梯卸货。滑梯多用钢筋混凝土结构,水磨石打蜡作面层;也可用金属骨架,钢板面层,但要防止钢板生锈或用不锈钢板作面层。多层仓库如单位荷载大于500公斤,可用无梁楼盖。仓库内一般不粉刷,埂浆勾缝刷白即可;贮存百货、药品、食品、服装的仓库内要粉刷,以防缝中藏虫。多层仓库中的“立体仓库”的存储和提货应用电子计算机,实现机械化。这种仓库占地面积小,节省人力,但贮存货物类别有一定范围。
圆筒形仓库 一般贮存散装水泥、干矿碴、粉煤灰、散装粮食、石油、煤气等气体。圆筒形仓库的建筑设计根据贮存物品的种类和进卸料方式确定。库顶、库壁和库底必须防水、防潮,库顶应设吸尘装置。为便于日常维修,要设置吊物孔、人孔(库壁设爬梯)、量仓孔和起重吊钩等。圆筒形仓库一般用现浇预应力钢筋混凝土结构,用滑模法施工。贮油库和贮气库则用金属结构。要注意仓库的通风,每层仓库的外墙上应设置百叶窗,百叶窗外加金属网,以防鸟雀。危险品库如贮油(气)或贮化工原料的仓库必须防热防潮,在屋面上加隔热层或按防爆屋面设计,出入口设置防火隔墙,地面用不产生火花的材料,一般可用沥青地面。贮油库要设置集油坑。食品仓库要防蚁防蜂。
问题五:堆栈是什么意思 在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。
要点:
堆:顺序随意
栈:先进后出
堆和栈的区别
一、预备知识―程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 *** 作方式类似于数据结构中的栈。
2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 ―常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区―存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
maincpp
int a = 0; 全局初始化区
char p1; 全局未初始化区
main()
{
int b; 栈
char s[] = abc; 栈
char p2; 栈
char p3 = 123456; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char )malloc(10);
p2 = (char )malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, 123456); 123456\0放在常量区,编译器可能会将它与p3所指向的123456优化成一个地方。
}
二、堆和栈的理论知识
21申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char )malloc(10);
在C++中用new运算符
如p2 = (char )malloc(10);
但是注意p1、p2本身是在栈中的。
22
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道 *** 作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
23申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈>>
问题六:什么是堆栈 堆栈是一种执行“后进先出”算法的数据结构。
设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入――push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址耿动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“d出pop”。如此就实现了后进先出的原则。
堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。
#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};
问题七:简述什么是堆栈,以及堆栈中入栈,出栈的过程 堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端
(称为栈顶(top))
对数据项进行插入和删除。要点:堆,顺序随意。栈,后进先出(Last-In/First-Out)。
针对栈这种数据结构的基本 *** 作有两种:压栈和d出,
在栈帧中包含两个标志----栈底和栈顶,其中栈顶标识着要push或pop
的数据的地址,而栈底则表示栈帧中最后一个数据的内存地址。
在Win32中,寄存器esp存放着栈底指针,栈是向低地址方向生长,
因此esp指向栈顶元素
堆栈对比( *** 作系统):
由编译器自动分配释放,存放函数的参数值,局部变量的值等。其
*** 作方式类似于数据结构中的栈栈使用的是一级缓存,
通常都是被调用时处于存储空间中,调用完毕立即释放
堆( *** 作系统):
一般由程序员分配释放,
若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些
堆(数据结构)
:堆可以被看成是一棵树,如:堆排序
栈(数据结构)
:一种后进先出的的数据结构
具体不同语言有不同的描述,可查看各种语言的api
问题八:什么是堆栈?堆栈有何作用? 满意答案 热心问友 2011-06-22堆栈其实是数据结果中的两个概念 ,是存放数据的方式,堆:顺序随意;栈:后进先出(Last-In/First-Out)。要说用处,那就是在写代码的时候,有时数据存取肯定是要有规定的顺序的,这个是你自己规定的,然后按照你所写程序的用处的特点来用堆还是栈还是队列之类的顺序 追问: 程序设计时,为什么要对堆栈指针SP重新赋值? 回答: 这不是初始化嘛堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。它的特点是按照先进后出的原则存取数据,这里的进与出是指进栈与出栈 *** 作。80C51片内RAM的部分单元可以用做堆栈。有一个8位的堆栈指针寄存器SP,丹用于指出当前堆栈顶部是片内RAM的哪一个单元。80C51单片机系统复位后SP的初值为07H,也就是将从内部RAM的08H单元开始堆放信息。但是,80C51系列的栈区不是固定的,只要通过软件改变SP寄存器的值便可更动栈区。为了避开工作寄存器区和位寻址区,SP的初值可置为2FH或更大的地址值。如果CPU在 *** 作中要使用两组工作寄存器,如果不使用位变量,SP的初值至少应为0FH或更大的值;如果使用位变量,SP的初值至少应为2FH或更大的值;KeilC51编译器会自动计算SP的初始设定值,无需编程者关心。
问题九:栈是什么意思? 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除 *** 作的线性表。 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始d出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除 *** 作的特殊线性表。允许进行插入和删除 *** 作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO--Last IN First Out表龚。 栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
上面已经说得很清楚了
虽然是复制的
问题十:堆栈的特点是什么? 堆栈是一种执行“后进先出”算法的数据结构
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入――push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“d出pop”。如此就实现了后进先出的原则。
keil的仿真功能在程序调试的时候特别常用,今天特整理出来供大家参考
1点击Debug图标,进入仿真模式,MDK多出一个工具条,这就是Debug工具条,这个工具条在仿真的时候非常有用。
工具条介绍:

1复位:其功能相当于硬件上的复位按键,按下一次后代码会重新从头开始执行。
2执行到断点处:用于快速执行到断点处,有的时候并不需要观看每步是怎么执行的,而是想快速执行到程序的某个地方查看结果,在你需要查看结果的地方打上断点。
3停止执行:使程序停止下来进入单步调试模式。
4执行进去:用来实现执行到某个函数里面去的功能。
5执行过去:再碰到有函数的地方,通过该按钮就可以单步执行过该函数,而不进入这个函数单步执行。
6执行出去:在进入该函数单步调试的时候,有时候你不需要再哦执行函数的剩余部分了,通过该按钮直接执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
7执行到光标处:迅速使函数运行到光标处,光标只有一个但是短点可以有多个。
8汇编窗口:查看汇编代码。
9堆栈局部变量:显示当前函数局部变量及其值,方便查看。
10观察窗口:MDK5提供了2个观察窗口,按下按钮会d出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值。
11内存查看窗口:MDK5提供了4个内存查看窗口,该按钮按下,可以在里面输入你要查看的内存地址,然后观察者一片内存变化情况。
12串口打印窗口:MDK5提供了4个串口打印窗口, 该按钮按下,会d出类似于串口调试助手的窗口,用于显示串口打印出来的内容。
13逻辑分析窗口:我们一般用第一个,逻辑分析窗口,通过SETUP按钮新建一些IO口,以多种形式展示出来这些IO口变化情况,比较直观。
14系统查看窗口:提供各种外设寄存器的查看窗口,选择对应的外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便的查看设置是否正确。
在使用的过程中去实际 *** 作这些按钮才能去真正明白这些工具条对应的功能,不知道什么意思可以先看一下,大体了解一下,再去实际调试。
以上就是关于keil 单片机 为什么 堆栈深度 默认为 一字节全部的内容,包括:keil 单片机 为什么 堆栈深度 默认为 一字节、51单片机用keil的变量堆栈、什么叫堆栈等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)