单片机程序执行分三步曲之堆栈原理学习原理

中断指令INT调用中断程序时,将标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值保存在堆栈中。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据。其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

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

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

堆栈操作由两条指令完成:PUSH和POP;

栈操作的操作数都是子类型(两个字节)进行操作。

程序存储器可以分为几个区域,栈区(stack)、堆区(Heap)、全局区(static)、文本常亮区、程序代码区。

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

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

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

为什么微控制器启动时不需要使用引导加载程序将代码从 ROM 移至 RAM,而 ARM 却需要。 这里我们可以先看一下单片机程序执行的过程。 单片机执行分为三步:执行—分析指令—执行指令。 取指令的任务是根据PC的值从程序存储器中读取指令并发送给指令寄存器。 然后分析并执行执行。 通过这种方式,微控制器从内部程序存储器中检索代码指令并从RAM中访问相关数据。 要知道RAM取数据的速度比ROM要高很多,但由于单片机本身运行频率不高,所以从ROM取指令的慢并没有影响。 与ARM不同的是,CPU的运行频率很高,比ROM的读写速度要快得多。 因此,一般操作系统在执行之前需要将部分代码复制到RAM中。

单片机程序执行分三步曲之堆栈原理学习原理

我们看一个网上很流行的经典例子:

主程序

整数a = 0; 全局初始化区

字符*p1; 全局未初始化区域

主要的()

整数b; 堆

char s[] = "abc"; 堆

字符*p2; 堆

字符*p3 =“123456”; 123456/0在常量区,p3在栈上。

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

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

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

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

网上有一个很好的比喻,摘录一下,方便理解:

使用堆栈就像我们去餐馆吃饭一样。 我们只是点餐(发出申请)、付款、吃饭(使用)。 当我们吃饱了,我们就离开。 切菜、洗菜、洗碗、洗锅等准备工作我们不用操心,收尾工作的好处是快,但自由度不大。

使用 Dui 就像制作自己喜欢的菜肴一样。 比较麻烦,但是更符合自己的口味,自由度更大。

总结:

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

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

2、这些存储单元的地址记录在一个称为堆栈指针(SP)的地方。

单片机

21cake怎么样?奇妙的味道令人快乐无比!

2024-3-4 10:02:36

单片机

E络盟与RS合作:树莓派基金会的股票

2024-3-4 11:00:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索