硬件堆栈和软件堆栈
- 格式:doc
- 大小:44.50 KB
- 文档页数:4
一、实验目的1. 理解堆栈的基本概念和原理;2. 掌握堆栈的基本操作,包括入栈、出栈、取栈顶元素等;3. 熟悉堆栈在编程中的应用,提高编程能力。
二、实验原理堆栈是一种后进先出(Last In First Out, LIFO)的数据结构,它由一系列元素组成,遵循“先进后出”的原则。
在堆栈中,新元素总是被添加到栈顶,而移除元素时,总是从栈顶开始。
堆栈的基本操作包括:1. 初始化:创建一个空堆栈;2. 入栈:将一个元素添加到堆栈的顶部;3. 出栈:从堆栈中移除顶部元素;4. 取栈顶元素:获取堆栈顶部的元素,但不从堆栈中移除;5. 判断堆栈是否为空:检查堆栈中是否还有元素。
三、实验器材1. 计算机软件:C/C++编译器;2. 程序代码编辑器:例如Visual Studio、Code::Blocks等。
四、实验步骤1. 初始化堆栈:创建一个空堆栈,并设置栈的最大容量。
2. 入栈操作:(1)检查堆栈是否已满,如果已满,则无法入栈;(2)将元素添加到堆栈的顶部。
3. 出栈操作:(1)检查堆栈是否为空,如果为空,则无法出栈;(2)从堆栈中移除顶部元素。
4. 取栈顶元素操作:(1)检查堆栈是否为空,如果为空,则无法取栈顶元素;(2)获取堆栈顶部的元素。
5. 判断堆栈是否为空操作:(1)检查堆栈中的元素个数,如果为0,则堆栈为空。
6. 编写程序实现上述操作,并进行测试。
五、实验结果与分析1. 初始化堆栈:创建一个最大容量为10的空堆栈。
2. 入栈操作:(1)入栈元素1,堆栈状态:[1];(2)入栈元素2,堆栈状态:[1, 2];(3)入栈元素3,堆栈状态:[1, 2, 3]。
3. 出栈操作:(1)出栈元素3,堆栈状态:[1, 2];(2)出栈元素2,堆栈状态:[1]。
4. 取栈顶元素操作:(1)取栈顶元素1,栈顶元素为1。
5. 判断堆栈是否为空操作:(1)判断堆栈是否为空,结果为“否”。
六、实验结论通过本次实验,我们掌握了堆栈的基本概念、原理和操作。
IAR的CSTACK和RSTACK的设置RSTACK 程序返回用的,保存的是程序调用函数的返回地址, 你填写的数值X 2才是占用的字节数,例如,你填写10,那么RSTACK尺寸是20字节,可以函数嵌套10层左右CSTACK 函数局部变量用的区域,所有的功能函数使用的局部变量都是从这个堆栈申请使用的,用完了再还回去。
子函数里面用到的局部变量都是在这里面取来用的.例如:void Fn(void){unsigned char TT[64];}TT[64] 就会从CSTACK取出来用,用完后TT没用了,就可以还给CSTACK了,当子函数使用局部变量太多的时候,要注意CSTACK尺寸当出现CSTACK和RSTACK溢出的时候,一般有2种情况:1. CSTACK和RSTACK真的不够用2. 中断反复重入,例如:当进去一个中断,你直接开启总中断,如果这个中断信号还在,那么中断函数会重入,这样你不管设置CSTACK和RSTACK多大,溢出是必然的, 一般情况是,如果你系统想执行所为的中断嵌套,你进去中断后,首先要关闭自身中断,然后再开总中断,退出时再重新开启自身中断CSTACK设大点,200也不算大。
RSTACK一般设置到32就够了。
32层函数,中断嵌套,一般应该够了。
如果代码空间不是很紧张,最高优化建议用speed优化。
这个问题也困扰过我,现在整理了拿出来。
在中断的时候,RAM溢出了,一般在中断里,堆栈最深,中断里出问题一般是RSTACK 的问题,这个是存函数调用返回地址的,也就是说,函数嵌套调用太多了。
而C编译器编译的代码操作堆栈的次数远比我们想的多,当然这也是一个优秀C编译器的高级之处。
我一般碰到的问题是CSTACK设置问题,CSTACK是用来存数据的,这些数据主要用于函数间传递参数、全局变量同步等等。
这个你要看E文版的IAR说明书。
这两个参数具体要设置多少,要看MAP文件。
IAR不会自动告诉你的,而是需要由用户设定好。
硬件基础名词解释流水线技术:将功能部件分离、执行时间重叠的一种技术,它可以在增加尽可能少的硬件设备情况下有效地提高CPU性能。
超流水线技术:把流水段进一步细分,使各段的功能部件在每个时钟周期内被使用多次,这样,在一个时钟周期内多条指令流入流水线,即在一个基本时钟周期内分时发射多条指令。
超标量:超标量处理器是指在处理器中安排多个指令执行部件,多条指令可以被同时启动和独立执行。
多核技术:在一个处理器封装中包含两个到多个物理处理器核心。
超长指令字:VLIW中编译器经过优化策略,将多条能并行执行的指令合并成一条具有多个操作码的超长指令。
微程序:完成指定任务的微指令序列称为微程序。
微程序存储器:存放计算机指令系统所对应的所有微程序的一个专门存储器。
通道程序:通道控制器和I/O处理器可以独立地执行一系列的I/O操作,I/O操作序列被称为I/O通道程序。
指令系统:一台计算机能执行的机器指令全体称为该机的指令系统。
堆栈:堆栈是一种按特定顺序访问的存储区;其特点是后进先出(LIFO)或先进后出(FILO)。
输入输出系统:通常把I/O设备及其接口线路、控制部件、通道或I/O处理器以及I/O软件统称为输入输出系统。
接口:接口是CPU与“外部世界”的连接电路,负责“中转”各种信息。
中断:由于内部/外部事件或由程序的预先安排引起CPU暂停现行程序,转而处理随机到来的事件,待处理完后再回到被暂停的程序继续执行,这个过程就是中断。
中断系统:是计算机实现中断功能的软、硬件的总称。
中断向量:把中断服务程序的首址PC和初始PSW称为中断向量。
数据通路:数据在功能部件之间传送的路径称为数据通路。
寻址方式:指定当前指令的操作数地址以及下条指令地址的方法称为寻址方式。
有效地址:数据实际存在的存储器地址。
波特率:单位时间内传送的二进制数据的位数,以位/秒(b/s)表示,也称为数据位率。
它是衡量串行通信速率的重要指标。
指令助记符:为了便于书写和阅读程序,每条指令通常用3个或4个英文缩写字母来表示。
【1】二、填空题(每空1分,共30分)1.一个完整的微机系统由硬件和软件两大部分组成。
2.8051 的引脚RST是IN脚(IN脚还是OUT脚),当其端出现高电平时,8051进入复位状态。
8051一直维持这个值,直到RST脚收到低电平,8051才脱离复位状态,进入程序运行状态,从ROM 0000 H单元开始取指令并翻译和执行。
3.半导体存储器分成两大类:RAM ROM,其中RAM 具有易失性,常用于存储临时性数据。
4.求十进制数-102的补码(以2位16进制数表示),该补码为9AH 。
5.PC存放_CPU将要执行的指令所在的ROM单元的地址,具有自动加1特性。
在8051中决定程序执行顺序的是PC还是DPTR PC ?它是16位?不是(是,不是)SFG?6.123= 01010010 B= 52 H。
7.8051内部有 4 个并行口,P0口直接作输出口时,必须外接上拉电阻;并行口作输入口时,必须先将口锁存器置1 ,才能读入外设的状态。
8.MCS-51的堆栈只可设置在内RAM低128B区,其最大容量为128B ,存取数据的原则是先进后出。
堆栈寄存器SP是8 位寄存器,存放堆栈栈顶的地址。
9.中断处理的全过程分为以下3个段:中断请求、中断响应、中断服务。
10.定时和计数都是对脉冲进行计数,定时与计数的区别是定时是对周期已知的脉冲计数;计数是对周期未知的脉冲计数【2】。
一、填空题(每空格1分,共10分)1.MCS—51布尔处理机的存储空间是_______。
2.P2口通常用作_______,也可以作通用的I/O口使用。
3.若由程序设定RS1、RS0=01,则工作寄存器R0~R7的直接地址为______。
4.8051的堆栈区一般开辟在_______。
5.所谓寻址,其实质就是_______。
6.存储器映象是_______。
7.定时器中断请求发生在_______。
8.中断响应时间是指______。
9.通过CPU对I/O状态的测试,只有I/O已准备好时才能进行I/O传送,这种传送方式称为_______。
dsp原理及应用试卷及答案【篇一:dsp原理及应用_复习题】ass=txt>1.累加器a分为三个部分,分别为。
1.ag,ah,al2.tms320vc5402型dsp的内部采用2.8,163.tms320vc5402型dsp采用总线结构对程序存储器和数据存储器进行控制。
3.哈佛4.tms329vc5402型dsp有个辅助工作寄存器。
4.8个5.dsp处理器tms320vc5402中daram的容量是字。
5.16k字6.ti公司的dsp处理器tms320vc5402pge100有___________个定时器。
6.27.在链接器命令文件中,page 1通常指________存储空间。
7.数据8.c54x的中断系统的中断源分为_______中断和____ ____中断。
8.硬件、软件1.ti公司dsp处理器的软件开发环境是__________________。
1.答:ccs(code composer studio)2.dsp处理器tms320vc5402外部有___________根地址线。
2.答:20根3.直接寻址中从页指针的位置可以偏移寻址3.答:1284.在链接器命令文件中,page 0通常指________存储空间。
4.答:程序5.c54x系列dsp处理器中,实现时钟频率倍频或分频的部件是_____________。
5.答:锁相环pll6.tms320c54x系列dsp处理器上电复位后,程序从指定存储地址________单元开始工作。
6.答:ff80h7.tms320c54x系列dsp处理器有_____个通用i/o引脚,分别是_________。
7.答:2个,bio和xf8.dsp处理器按数据格式分为两类,分别是;。
8.答:定点dsp和浮点dsp9.tms329vc5402型dsp的st1寄存器中,intm位的功能是。
9.答:开放/关闭所有可屏蔽中断10.ms320c54x dsp主机接口hpi是________位并行口。
单片机名词解释一、名词解释1.微处理器:即中央处理器CPU,它是把运算器和控制器集成在一块芯片上的器件总称。
2.单片机(单片微型计算机):把CPU、存储器、I/O接口、振荡器电路、定时器/计数器等构成计算机的主要部件集成在一块芯片上构成一台具有一定功能的计算机,就称为单片微型计算机,简称单片机。
3.程序计数器:程序计数器PC是一个不可寻址的16位专用寄存器(不属于特殊功能寄存器),用来存放下一条指令的地址,具有自动加1的功能。
4.数据指针:数据指针DPTR是一个16位的寄存器,可分为两个8位的寄存器DPH、DPL,常用作访问外部数据存储器的地址寄存器,也可寻址64K字节程序存储器的固定数据、表格等单元。
5.累加器:运算时的暂存寄存器,用于提供操作数和存放运算结果。
它是应用最频繁的寄存器,由于在结构上与内部总线相连,所以一般信息的传送和交换均需通过累加器A。
6.程序状态字:程序状态字PSW是一个8位寄存器,寄存当前指令执行后的状态,为下条或以后的指令执行提供状态条件。
它的重要特点是可以编程。
7.堆栈:堆栈是一组编有地址的特殊存储单元,数据遵循先进后出的存取原则。
栈顶地址用栈指针SP指示。
8.软件堆栈:通过软件唉内部RAM中定义一个区域作为堆栈(即由软件对SP设置初值),称软件堆栈。
9.振荡周期(晶振周期):振荡电路产生的脉冲信号的周期,是最小的时序单位。
10.时钟周期:把2个振荡周期称为S状态,即时钟周期。
1个时钟周期=2个振荡周期。
11.机器周期:完成一个基本操作所需的时间称为机器周期。
1个机器周期=12个振荡周期。
12.指令周期:执行一条指令所需的全部时间称为指令周期。
MCS-51单片机的指令周期一般需要1、2、4个机器周期。
13.地址/数据分时复用总线:是指P0口用作扩展时,先输出低8位地址至地址锁存器,而后再由P0口输入指令代码,在时间上是分开的。
14.准双向并行I/O口:当用作通用I/O口,且先执行输出操作,而后要由输出变为输入操作时,必须在输入操作前再执行一次输出“1”操作(即先将口置成1),然后执行输入操作才会正确,这就是准双向的含义。
stm32 单机程序栈保护机制
STM32单片机的程序栈保护机制是一种用于保护程序运行时堆栈空间的技术。
在STM32单片机中,堆栈保护可以通过使用硬件和软件相结合的方式来实现。
下面我将从硬件和软件两个方面来介绍STM32单片机的程序栈保护机制。
硬件方面:
STM32单片机的硬件提供了一些特性来保护程序的堆栈空间。
其中最常见的是硬件堆栈保护功能。
在STM32单片机中,可以通过设置相关的寄存器来启用硬件堆栈保护。
这样可以防止堆栈溢出和堆栈破坏,提高系统的稳定性和安全性。
另外,STM32单片机还提供了一些特殊的寄存器和机制,用于监控堆栈的使用情况,比如堆栈指针寄存器(SP)和堆栈溢出检测机制等。
这些硬件特性可以帮助开发人员及时发现和处理堆栈相关的问题,保障程序的正常运行。
软件方面:
除了硬件保护机制,STM32单片机的程序堆栈还可以通过软件
来进行保护。
比如,开发人员可以在编写程序时,合理规划堆栈的
大小,避免出现堆栈溢出的情况。
此外,还可以通过编写堆栈溢出
检测的代码来监控堆栈的使用情况,及时发现并处理堆栈溢出的问题。
另外,开发人员还可以通过使用一些静态分析工具或者动态调
试工具来检测程序中可能存在的堆栈问题,及时进行修复和优化。
总结:
综上所述,STM32单片机的程序堆栈保护机制包括硬件和软件
两个方面。
通过合理配置硬件保护特性和编写规范的软件代码,可
以有效保护程序的堆栈空间,提高系统的稳定性和安全性。
开发人
员在使用STM32单片机时,应该充分了解和掌握这些堆栈保护技术,以确保程序的正常运行。
u C/OS-II移植总结RTOS移植牵涉到软件平台—编译器、硬件平台—CPU,移植前需要了解CPU及编译器的一些基本特点。
1、编译器a、堆栈运行原理本次移植的软件平台为CodeVision编译器,它的堆栈由两部分组成:硬件堆栈(HardStack)用来保存中断及函数调用的返回地址,它的大小将影响函数调用嵌套的深度,实际大小应根据中断及函数嵌套的深度来决定,并留有一定的裕度。
硬件堆栈由CPU中的指针SP实现。
软件堆栈(SoftStack)用来分配局部变量及传递参数。
在此次移植中,由CPU中的Y指针模拟实现。
b、堆栈指针所指向的单元是否为可用单元大多数编译器生成的代码,其堆栈指针所指向的单元为可用单元,也就是说在将数据压入堆栈前不用再调整堆栈指针,堆栈指针在上一次使用完后已经调整好了。
前面所说的硬件堆栈(HardStack)即为这种类型。
还有一种堆栈,其指针所指向的单元为不可用单元,在向堆栈压入数据前需调整堆栈指针,软件堆栈(SoftStack)即为这种类型。
软件堆栈设计为这种形式完全是为了适应A VR指令和软件堆栈增长方向与硬件堆栈增长方向相同。
软件堆栈(SoftStack)由Y指针模拟实现,但在A VR的指令集中只有:LD Rd,Y+ LD Rd,–Y ST Y+,Rr ST –Y,Rr要实现向下增长的堆栈就只能使用ST –Y,Rr和LD Rd,Y+。
指针指向的单元已压入数据,因此使用前需调整指针,而ST –Y,Rr正好能完成这个动作。
c、多字节变量在宽度为单字节的存储器中的分配规则多字节变量指定义为int、long int、float、double等类型的变量。
在CodeVision编译器遵循的原则是:变量低字节部分分配在内存的低地址单元,变量高字节部分分配在内存高地址单元。
如:int a a为双字节变量,其低字节保存在内存的0x24H,则高字节保存在内存的0x25H。
了解这些变量在内存中存储形式是为了能够在在线汇编中正确操作它们。
堆栈型机器名词解释1. 引言在计算机科学领域中,堆栈(stack)是一种数据结构,它采用了“后进先出”(Last In, First Out,LIFO)的原则。
堆栈型机器是一种基于堆栈数据结构实现的计算机系统,其中计算机指令和数据都存储在堆栈中。
本篇文章将为您解释堆栈型机器的概念,包括其原理、应用和优缺点。
2. 堆栈型机器的原理堆栈型机器的基本原理是使用堆栈来处理数据和指令。
堆栈由两个主要操作组成,即入栈(push)和出栈(pop)。
当一个元素被入栈时,它被添加到堆栈的顶部;而当一个元素被出栈时,它从堆栈的顶部被移除。
在堆栈型机器中,计算机指令和操作数被存储在堆栈中。
当需要执行某个指令时,操作数从堆栈中弹出,执行相应的运算,并将结果重新压入堆栈。
这种设计思路简化了计算机的指令集,使得堆栈型机器在某些应用场景下具有较高的效率。
3. 堆栈型机器的应用堆栈型机器在许多领域都有广泛的应用。
其中一个典型的应用场景是编程语言的解释器和虚拟机。
Java虚拟机就是一种堆栈型机器,它执行Java字节码指令。
由于Java字节码是基于堆栈的,因此堆栈型机器非常适合执行这种类型的指令。
堆栈型机器还被广泛应用于图形计算、嵌入式系统和计算机网络等领域。
在这些领域中,堆栈型机器可以提供高效的计算和优化的内存管理,从而快速响应需求并节省资源。
4. 堆栈型机器的优缺点堆栈型机器具有一些显著的优点,也有一些局限性。
由于堆栈型机器的指令集相对较小,编程语言实现和编译器的开发相对容易。
堆栈型机器具有良好的可移植性,因为它们不依赖于具体的硬件架构。
由于堆栈型机器使用的是后进先出的执行顺序,它可以轻松地处理递归调用和函数嵌套。
然而,堆栈型机器也存在一些局限性。
由于数据和指令都存储在堆栈中,堆栈的大小限制了堆栈型机器的存储能力。
由于堆栈型机器的指令执行顺序是固定的,它在某些情况下可能会受到性能影响。
5. 总结与展望在本篇文章中,我们对堆栈型机器进行了深入解析。
什么叫软件堆栈,什么叫硬件堆栈?
什幺叫软件堆栈,什幺叫硬件堆栈?两者的区别是什幺?
看其栈顶指针是否和CPU具有特殊的关联,有关联者(如SP)硬,而无关联者软。
单片机在执行调用子程序的指令时,一般会把返回地址自动存入堆栈,而没有被单片机自动入栈但是也需要保存的内容比如状态寄存器、通用寄存器等,就得通过PUSH等指令把它们人为地保存到堆栈中。
自动入栈和人为入栈可能使用的是一个堆栈指针。
有的单片机可以分开,比如AVR,可以通过ST -Y, R0这样的指令把R0存入软件堆栈区(Y是由R28和R29两个寄存器的值组成的16位指针),有的单片机缺少这样的指令,就会把软件堆栈和硬件堆栈放在一个栈空间,都使用SP,比如51.
扩展阅读:PIC单片机堆栈学习笔记。
计算机组成原理中的堆栈简介
计算机组成原理中的堆栈是一种数据结构,它遵循后进先出(LIFO)的原则。
堆栈通常用于存储函数调用、临时变量和其他临
时数据。
在计算机组成原理中,堆栈通常是通过内存中的一段特定
区域来实现的。
堆栈通常由两个主要操作组成,压栈(push)和弹栈(pop)。
压栈操作将数据放入堆栈顶部,而弹栈操作则从堆栈顶部移除数据。
这种操作使得最后压入堆栈的数据最先被弹出,因此堆栈遵循LIFO
原则。
在计算机组成原理中,堆栈经常用于存储函数调用的返回地址
和局部变量。
当一个函数被调用时,当前函数的返回地址会被压入
堆栈,以便在函数执行完毕后能够返回到正确的位置。
同时,函数
内部的局部变量也可以被存储在堆栈中,以便在函数执行期间可以
方便地访问和操作这些变量。
堆栈还可以用于表达式求值和语法分析。
例如,后缀表达式的
求值就可以通过堆栈来实现。
在语法分析中,堆栈可以用于存储和
处理语法规则,以便进行语法分析和语法树的构建。
在计算机硬件中,堆栈通常与栈指针(stack pointer)和基址
寄存器(base pointer)相关联。
栈指针指向当前堆栈顶部的位置,而基址寄存器则指向堆栈的基址,用于定位局部变量和函数参数的
存储位置。
总的来说,堆栈在计算机组成原理中扮演着重要的角色,它不
仅是一种数据结构,还在函数调用、表达式求值和语法分析等方面
发挥着重要作用。
深入理解堆栈的原理和应用对于理解计算机组成
原理和编程语言的工作原理至关重要。
第一章电脑系统结构的基本概念1.有一个电脑系统可按功能分成4级,每级的指令互不相同,每一级的指令都比其下一级的指令在效能上强M倍,即第i级的一条指令能完成第i-1级的M条指令的计算量。
现假设需第i级的N 条指令解释第i+1级的一条指令,而有一段第1级的程序需要运行Ks,问在第2、3和4级上一段等效程序各需要运行多长时间?答:第2级上等效程序需运行:(N/M)*Ks。
第3级上等效程序需运行:(N/M)*(N/M)*Ks。
第4级上等效程序需运行:(N/M)*(N/M)*(N/M)*Ks。
note: 由题意可知:第i级的一条指令能完成第i-1级的M条指令的计算量。
而现在第i 级有N条指令解释第i+1级的一条指令,那么,我们就可以用N/M来表示N/M 表示第i+1级需(N/M)条指令来完成第i级的计算量。
所以,当有一段第1级的程序需要运行Ks时,在第2级就需要(N/M)Ks,以此类推2.硬件和软件在什么意义上是等效的?在什么意义上又是不等效的?试举例说明。
答:软件和硬件在逻辑功能上是等效的,原理上,软件的功能可用硬件或固件完成,硬件的功能也可用软件模拟完成。
但是实现的性能价格比,实现的难易程序不同。
在DOS操作系统时代,汉字系统是一个重要问题,早期的汉字系统的字库和处理程序都固化在汉卡〔硬件〕上,而随着CPU、硬盘、内存技术的不断发展,UCDOS把汉字系统的所有组成部份做成一个软件。
3.试以实例说明电脑系统结构、电脑组成与电脑实现之间的相互关系与影响。
答:电脑系统结构、电脑组成、电脑实现互不相同,但又相互影响。
〔1〕电脑的系统结构相同,但可采用不同的组成。
如IBM370系列有115、125、135、158、168等由低档到高档的多种型号机器。
从汇编语言、机器语言程序设计者看到的概念性结构相同,均是由中央处理机/主存,通道、设备控制器,外设4级构成。
其中,中央处理机都有相同的机器指令和汇编指令系统,只是指令的分析、执行在低档机上采用顺序进行,在高档机上采用重叠、流水或其它并行处理方式。
单片机5级堆栈介绍在嵌入式系统中,单片机(Microcontroller)的5级堆栈通常是指五个不同的堆栈级别,用于存储和管理程序执行时的数据。
这些堆栈级别在单片机的架构中起到重要的作用。
以下是这五个堆栈级别的简要介绍:1. 硬件堆栈(Hardware Stack):-硬件堆栈是由单片机硬件实现的,用于存储程序执行时的返回地址和一些特定的状态信息。
当函数调用时,返回地址被压入硬件堆栈。
硬件堆栈通常由硬件自动管理。
2. 中断堆栈(Interrupt Stack):-中断堆栈用于存储中断处理程序的状态信息。
当中断发生时,当前程序的状态被保存到中断堆栈,然后中断服务程序执行。
中断服务程序执行完毕后,从中断堆栈中恢复之前的状态,继续执行主程序。
3. 系统堆栈(System Stack):-系统堆栈用于存储系统级别的函数调用和返回地址。
在一些体系结构中,系统堆栈可能用于处理一些系统级别的任务,如操作系统调度等。
4. 用户堆栈(User Stack):-用户堆栈是用于存储用户程序的局部变量、函数参数等信息的地方。
当函数被调用时,相关的数据被压入用户堆栈。
这个堆栈由编写程序的开发者负责管理。
5. 应用堆栈(Application Stack):-应用堆栈是为特定应用程序或任务保留的堆栈空间。
它可以用于存储应用程序特定的数据、状态信息等。
这个堆栈通常由应用程序的开发者定义和管理。
这五个堆栈级别共同构成了单片机在执行程序时的堆栈体系,确保了程序的正确执行和上下文的正确保存和还原。
堆栈的使用使得单片机能够有效地管理程序执行中的数据和状态。
不同的单片机架构可能有不同的堆栈实现方式和级别。
大白话解释堆栈-概述说明以及解释1.引言1.1 概述堆栈(Stack)是一种常见的数据结构,被广泛应用于计算机科学中的各个领域。
它是一种“后进先出”(Last In First Out,简称LIFO)的数据结构,类似于我们日常生活中的堆叠物品,即最后放入的物品最先取出。
在计算机科学中,堆栈被用来管理程序运行时的内存。
它按照一定的规则对数据进行存储和操作,使得程序可以高效地执行。
堆栈的基本操作包括“入栈”和“出栈”,即向堆栈中插入数据和从堆栈中取出数据。
入栈操作将数据放入堆栈顶部,出栈操作则从堆栈顶部删除数据。
堆栈的特点之一是其操作快速高效。
由于堆栈是一个有限空间,存储和访问数据的代价相对较低,使得程序可以快速地执行堆栈操作。
此外,堆栈还具有良好的封装性,即不允许直接访问中间的数据项,只能通过栈顶进行操作。
这种封装性使得程序更安全,减少了错误的发生。
堆栈在计算机科学中有着广泛的应用场景。
在程序中,堆栈常被用于存储函数调用、表达式求值等临时数据。
此外,堆栈还可以用来实现算法中的回溯和递归操作,以及处理系统中的进程调度等任务。
堆栈的应用不仅限于软件领域,在硬件领域也有广泛的应用,例如处理器中的指令堆栈、网络中的数据包堆栈等。
通过对堆栈的深入理解和掌握,我们可以更好地设计和优化程序,提高系统的效率和性能。
因此,了解堆栈的定义、特点和应用场景非常重要。
接下来的章节将详细介绍堆栈的定义和特点,以及它在不同领域中的应用和优势。
通过对堆栈的全面了解,我们可以更好地利用它来解决实际问题,并为未来的发展展望提供指导。
1.2文章结构文章结构部分的内容可以按照以下方式编写:文章结构部分是整篇文章的重要组成部分,它帮助读者更好地理解文章的脉络和逻辑结构。
本文将通过引言、正文和结论三个部分来组织讲解。
首先,引言部分将为读者提供一个概述,简要介绍将要讨论的主题——堆栈。
文章结构的目的是让读者对即将讲解的内容有一个整体的把握。
软件堆栈和硬件堆栈概念分析
函数中的栈
栈是一种具有先入后出特性的数据结构,前面说过,这种特性常常用来帮住我们原理返回或者保持原样。
试想,当我们第一次来到一个陌生的城市,走在陌生的街道上,寻找一个陌生的目标,最令我们有安全感的莫过于仔细记录走过的每一个街道、穿过的每一个路口--这种安全感来源于潜意识
里万一找不到目的地就原路返回的想法。
记得20世纪90年代,有一首家喻户晓的流行歌曲《星星点灯》中曾这样唱到星星点灯。
为迷失的孩子,照亮来时的路。
找到来时的路这种想法是人们基本的求生本能,对有人类编写的C
语言编译器来说,也是这样--面对一层一层复杂嵌套关系的函数调用,编译
器总是试图记录下我们调用的过程,以便找回回去的路。
栈就在这种场合中,得到了广泛的应用。
C语言支持函数的调用,这完全得益于栈式分配策略的使用。
所谓栈式分配,抛去复杂的技术细节,简单说来,就是将函数内部使用的种种信息(例如,局部变量)在发生函数嵌套调用时,压入栈中记录下所走过的路。
这样,当调用的函数运行结束需要返回时,编译器就能很容易从栈中找到来时的路。
使用模拟的方法,我们来具体看看这一过程。
硬件堆栈和软件堆栈在AVR中的理解
(2010-02-01 18:43:03)
首先是从理论上的东西。
网上转载来的,后面是看AVR代码时得出的一些东西。
硬件堆栈:或许也可以称作系统堆栈,是位于片内RAM区。
有人说,只要能使用PUSH,POP指令的单片机,都可以说含有硬件堆栈。
这样的说法我个人觉得不是很全面。
通过指令进行压栈和出栈操作只是系统堆栈中的一种操做。
系统堆栈还可以被隐含调用。
例如,当调用子程序时,系统会主动把返回地址压入堆栈,并不需要用户通过指令操作。
通常,栈底设在内存的高端,也就是把内存的最高一段空间划作栈区。
这些都是向下生长栈。
栈指针可能是专用的寄存器,也可能借用一通用寄存器。
也有单片机是在数据区里划一块作栈区,可能是向上生长,也可能是向下生长。
硬件堆栈:是通过寄存器SPH,SPL做为索引指针的地址,是调用了CALL,RCALL等函数调用指令后硬件自动填充的堆栈!
软件堆栈:是编译器为了处理一些参数传递而做的堆栈,会由编译器自动产生和处理,可以通过相应的编译选项对其进行编辑。
简单一点说,硬件堆栈主要做为地址堆栈用,而软件堆栈主要会被分配成数据堆栈!
---摘自《AVR单片机C语言开发入门指导》- P169---
ICCAVR 使用两个堆栈:一个用于子程序调用和中断操作的硬件堆栈,一个用于传递参数、临时变量和局部变量的软件堆栈。
可以使用堆栈检测函数检测两个堆栈是否溢出。
单片机在执行调用子程序的指令时,一般会把返回地址自动存入堆栈,而没有被单片机自动入栈但是也需要保存的内容比如状态寄存器、通用寄存器等,就得通过PUSH等指令把它们人为地保存到堆栈中。
自动入栈和“人为入栈”可能使用的是一个堆栈指针。
有的单片机可以分开,比如AVR,可以通过“ST -Y, R0”这样的指令把R0存入软件堆栈区(Y是由R28和R29两个寄存器的值组成的16位指针),有的单片机缺少这样的指令,就会把软件堆栈和硬件堆栈放在一个栈空间,都使用SP,比如51.
看其栈顶指针是否和CPU具有特殊的关联,有关联者(如SP)“硬”,而无关联者“软”。
如果没有硬堆栈,你可以选定一个寄存器作堆栈指针,通过软件实现堆栈操作。
移植μC/OS-II也不一定要硬堆栈。
ARM 就很难说它的堆栈是软的还是硬的。
32位的ARM指令中没有PUSH、POP指令。
ARM习惯上用R13作堆栈指针(SP),但用别的寄存器作堆栈指针也未常不可。
ARM习惯上用LDM/STM(多寄存器加载/存储指令)来操作堆栈,压多少,按什么顺序都能选择。
应该说ARM是软硬结合的堆栈。
C代码(AVR-GCC编译,优化等级-00):
#include <avr/io.h>
int add(int a,int b)
{
int c;
c=a+b;
return c;
}
int main(void)
{
int a=2,b=3,c=0;
c=add(a,b);
//c=sub(a,b);
}
汇编代码:
(省略一些boot代码)。
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95 //此处Y指针和SP都指到了SRAM最高端
5a: d4 e0 ldi r29, 0x04 ; 4
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61。
0000008e <add>:
#include <avr/io.h>
int add(int a,int b)
{
8e: cf 93 push r28
90: df 93 push r29 //保存了Y指针,此时SP已经-2,这里再减2
92: cd b7 in r28, 0x3d ; 61 //重新定位Y指针跟SP一样。
94: de b7 in r29, 0x3e ; 62
96: 26 97 sbiw r28, 0x06 ; 6 //减掉6,即向下开了6字节的区域,存放3变量 98: 0f b6 in r0, 0x3f ; 63
9a: f8 94 cli
9c: de bf out 0x3e, r29 ; 62
9e: 0f be out 0x3f, r0 ; 63
a0: cd bf out 0x3d, r28 ; 61
a2: 9a 83 std Y+2, r25 ; 0x02
a4: 89 83 std Y+1, r24 ; 0x01
a6: 7c 83 std Y+4, r23 ; 0x04
a8: 6b 83 std Y+3, r22 ; 0x03
int c;
c=a+b;
aa: 29 81 ldd r18, Y+1 ; 0x01
b2: 82 0f add r24, r18
b4: 93 1f adc r25, r19
b6: 9e 83 std Y+6, r25 ; 0x06
b8: 8d 83 std Y+5, r24 ; 0x05
return c;
ba: 8d 81 ldd r24, Y+5 ; 0x05
bc: 9e 81 ldd r25, Y+6 ; 0x06
be: 26 96 adiw r28, 0x06 ; 6 //加了6个字节空间,Y指针恢复到减6之前
c0: 0f b6 in r0, 0x3f ; 63
c2: f8 94 cli
c4: de bf out 0x3e, r29 ; 62
c6: 0f be out 0x3f, r0 ; 63
c8: cd bf out 0x3d, r28 ; 61
ca: df 91 pop r29
cc: cf 91 pop r28
ce: 08 95 ret //弹出堆栈中2个字节
000000d0 <main>:
}
int main(void)
{
d0: c9 e5 ldi r28, 0x59 ; 89 //这4句给SP和Y指针重新赋值了,很明显的在SP的 d2: d4 e0 ldi r29, 0x04 ; 4 //上面还有6个字节(SRAM最大到045E),这6个字节 d4: de bf out 0x3e, r29 ; 62 //被存放了a,b,c三个变量(可以与上面理论对应)
d6: cd bf out 0x3d, r28 ; 61 //通过Y指针来保存了这三个变量到这个区域
int a=2,b=3,c=0;
d8: 82 e0 ldi r24, 0x02 ; 2
da: 90 e0 ldi r25, 0x00 ; 0
dc: 9a 83 std Y+2, r25 ; 0x02
de: 89 83 std Y+1, r24 ; 0x01
e0: 83 e0 ldi r24, 0x03 ; 3
e2: 90 e0 ldi r25, 0x00 ; 0
e4: 9c 83 std Y+4, r25 ; 0x04
e6: 8b 83 std Y+3, r24 ; 0x03
e8: 1e 82 std Y+6, r1 ; 0x06
ea: 1d 82 std Y+5, r1 ; 0x05
c=add(a,b);
f2: 9a 81 ldd r25, Y+2 ; 0x02
f4: 0e 94 47 00 call 0x8e <add> //使用call时自动将PC+2的地址压到堆栈
f8: 9e 83 std Y+6, r25 ; 0x06
fa: 8d 83 std Y+5, r24 ; 0x05
//c=sub(a,b);
}
fc: 80 e0 ldi r24, 0x00 ; 0
fe: 90 e0 ldi r25, 0x00 ; 0
100: 0c 94 82 00 jmp 0x104 <_exit>
00000104 <_exit>:
104: ff cf rjmp .-2 ; 0x104 <_exit>
r28和r29一起组成SP指针,Y指针可以作为间接寻址,很明显的刚开始的时候Y指针和SP都在045F这里,后来在高处开了6个字节的空间来存放临时变量,所以Y指针成了这个软件堆栈的栈顶,在这个过程中都是使用Y 和SP的配合来实现变量和数据的改变,以及恢复,硬件堆栈和软件堆栈在这里已经不怎么区分了。
不清楚流程可以画个图来加深理解,好了,看了那么久,总算有点感觉了。