单片机中堆栈那些事儿

堆栈是内存中一段连续的存储区域,用来保存一些临时的数据,比如,可以保存中断指令INT中的标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值;还可以用以RET指令从中可以得到返回的地址;堆栈还可以保存其他的数据等等。

在汇编语言中堆栈操作由PUSH、POP两条指令来完成。它的操作数均为子类型[两个字节]进行操作。

程序内存可以分为:堆区、栈区、全局区、程序代码区、文字常亮区。在一个程序编译完后,已经为全局变量、静态变量分配好内存空间,所以在函数运行的时候,程序内存要为局部变量非配好栈空间,当中断来时,也需要把函数指针入栈,用来保护当前的情况(保护现场),以便于中断处理完之后可以再回到之前的函数。

栈是从高到低的分配或者说先进后出(就像子弹夹),堆是从低到高的分配(就是先到先买,后到后买)。在一般的交谈中我们所说的堆栈默认为栈(子弹夹)。然而,堆栈可以分为硬堆栈和软堆栈,硬堆栈就是SPstack pointer栈顶元素的下一个位置,所以数据入栈的时候,SP先加1,再压入数据,出栈时,数据先出,然后SP再减1,软堆栈就是在硬堆栈和全局变量区之间的空间。

我们知道,单片机在启动的时候,不需要使用bootlloader将代码从ROM搬移到ARM,但是ARM则需要使用bootlloader将代码搬移。所以我们可以从单片机的执行步骤(获取执行指令—分析指令—执行指令);获取指令的过程就是根据上位机的值从程序存储器读出指令,送到指令寄存器,然后去分析指令,这样单片机就从内部程序存储器取到代码指令,从RAM存或获取相关的数据。我们知道RAM(随机存取存储器)的存取数据的速度高于ROM(只读存储器)的速度,而一般的单片机的运行频率不太高,所以从ROM获取指令慢并不受影响,但是RAM就不一样了,CPU运行的频率高,速度比ROM快,所以一般的操作系统,都会将代码部分拷贝到RAM中在执行,这样才可以使其运行速率更快。


main.cpp

  int a = 0; 全局初始化区

  char *p1; 全局未初始化区

  main()

  {

扫描二维码关注公众号,回复: 2170787 查看本文章

  int b; 栈

  char s[] = "abc"; 栈

  char *p2; 栈

  char *p3 ="123456"; 123456/0在常量区,p3在栈上。

  static int c =0; 全局(静态)初始化区

  p1 = (char *)

   p1 = (char *)malloc(10); 堆

  p2 = (char *)malloc(20); 堆

  }

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

综上所述,我们可以一个比喻形容:栈就是我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。而堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。


猜你喜欢

转载自blog.csdn.net/qq_21990661/article/details/79779849