美文网首页
对单片机堆栈的理解

对单片机堆栈的理解

作者: qwer2626 | 来源:发表于2020-07-27 16:02 被阅读0次

 看关于单片机方面的书籍的时候,总是能看到别人说的一些堆栈啊什么的操作,之前看到这个术语就直接跳过,没想到去探究单片机内部的原理。但是最近课程学习微机原理这门课,需要我们写汇编程序,汇编里面经常遇到堆栈这个东西,所以就找了个时间把堆栈给彻底的搞一下。

  如果了解一点汇编编程话,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。通常用来保存CALL指令调用子程序时的返回地址,RET指令从堆栈中获取返回地址。中断指令INT调用中断程序时,将标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值保存在堆栈中。

  堆栈也可以用来保存其他数据。

  堆栈操作由PUSH,POP两条指令来完成;

  堆栈操作的操作数均为子类型(两个字节)进行操作。

  程序内存可以分为几个区,栈区(stack),堆区(Heap),全局区(static),文字常亮区,程序代码区。

  程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。

  栈是从高到低分配,堆是从低到高分配。

  我们一般说的堆栈指的栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间,C51函数调用通过R0-R7和栈来实现。

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

  再来看一个网上很流行的经典例子:

  main.cpp

  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); 堆

  }

  不知道你是否有点明白了,堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

  网上一个很好的比喻,摘抄下来,以便理解:

  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

  使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

  总结:

  其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

  如果非要给他加几个特点的话那就是:1、这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。

  2、这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。

从单片机到嵌入式linux我们需要做什么

http://www.makeru.com.cn/live/5413_1994.html?s=156461

相关文章

  • 对单片机堆栈的理解

    看关于单片机方面的书籍的时候,总是能看到别人说的一些堆栈啊什么的操作,之前看到这个术语就直接跳过,没想到去探究单片...

  • iOS 堆栈的理解

    Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管...

  • Java堆栈的理解

    概述 先Copy一个概念:JVM是基于堆栈的虚拟机。JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Ja...

  • Go 堆栈的理解

    在讲Go的堆栈之前,先温习一下堆栈基础知识。 什么是堆栈?在计算机中堆栈的概念分为:数据结构的堆栈和内存分配中堆栈...

  • 零基础初探51开发板

    单片机:我的简单理解:迷你版本的电脑或者说电脑是一个超级强的单片机单片机 pc电脑CPU...

  • 命题-单片机-选择

    以51系列单片机为例,执行中断返回指令,从堆栈弹出的地址送给: -A. A-B. CY-C. PC-D. DPT...

  • C语言编程: 函数调用中堆栈的个人理解

    接下来将通过下面几个问题解析函数调用中对堆栈理解: (1)函数调用过程中堆栈在内存中存放的结构如何? (2)汇编语...

  • 实验一 崔提提0128

    实验目的:为了进一步掌握单片机(大板的使用),理解单片机的工作原理,实现在单片机上实现显示 实验器材:keil、单...

  • 实验一:LED点阵显示汉字实验+邓宏0103

    实验目的:为了进一步掌握单片机(大板的使用),理解单片机的工作原理,实现在单片机上实现显示字母“SUN” 实验器材...

  • 实验一 李小东0105

    实验目的:为了进一步掌握单片机中点阵的使用,理解单片机的工作原理,实现在单片机上实现显示 实验器材:keil、单片...

网友评论

      本文标题:对单片机堆栈的理解

      本文链接:https://www.haomeiwen.com/subject/tfwzlktx.html