[转]再识Cortex-M3之堆栈
原地址https://blog.csdn.net/liaoxu02/article/details/48107651
Cortex-M3拥有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最”通用目的“的,绝大多数的16位指令只能使用R0-R7,而32位的Thumb-2指令则可以访问所有的通用寄存器。特殊功能寄存器必须通过专用的指令来访问。
通用目的寄存器R0-R7
R0-R7称为低组寄存器。所有指令都可以访问,R8-R12称为高组寄存器,只有很少的16位Thumb指令能访问他们,32位的Thumb-2指令则不受限制。
访问堆栈用堆栈指针,并且PUSH指令和POP指令默认使用SP。
堆栈的PUSH与POP
堆栈是一种存储器的使用模型。它由一块连续的内存和一个栈顶指针组成,用于实现”后进先出“的缓冲区。其最典型的应用,就是在数据处理前先保存寄存器的值,再在处理任务完成后从中恢复先前保护的这些值。
注:寄存器的PUSH和POP操作永远都是4字节对齐的。原因是:堆栈指针的最低两位永远是0。
栈内存操作
在Cortex-M3中,除了可以使用PUSH和POP指令来处理堆栈外,内核还会在异常处理的始末自动PUSH和POP操作。
堆栈的基本操作
堆栈的功能就是把寄存器的数据临时备份在内存中,以便将来能恢复之——在一个任务或一段子程序执行完毕后恢复。
.....(主程序)
; R0, R1=Y, R2=Z
BL Fx1
Fx1
PUSH {R0} ;把R0存入栈&调整SP
PUSH {R1} ;把R1存入栈&调整SP
PUSH {R2} ;把R2存入栈&调整SP
..... ;执行Fx1的功能,中途可以改变R0-R2的值
POP {R2} ;恢复R2早先的值&再次调整SP
POP {R1} ;恢复R1早先的值&再次调整SP
POP {R0} ;恢复R0早先的值&再次调整SP
BX LR ;返回
;返回主程序
;R0=X,R1=Y.R2=Z(调用Fx1的前后R0-R2的值完好无损)
PUSH/POP指令足够体贴,支持一次操作多个寄存器。
Cortex-M3的堆栈实现
Cortex-M3使用的是”向下生长的满栈“模型。堆栈指针SP指向一个被压入堆栈的32位数值。在下一次压栈时,SP先自减4,在存入新的数值。如下图:
在看看Cortex-M3的双堆栈机制
我们上面已经知道了堆栈是分为两个:主堆栈和进程堆栈,CONTROL[1]决定如何选择。
当CONTROL[1]=0时,只使用MSP,此时用户程序和异常handler共享同一个堆栈。
这里写图片描述
当CONTROL=[1]=1时,线程模式将不再使用MSP,而改用PSP(handler模式永远使用MSP)。
这里写图片描述
这样的好处是:在使用OS的环境下,只要OS内核仅在handler模式下执行,用户应用程序仅在用户模式下执行,这样就可以防止用户程序的堆栈错误破坏OS使用的堆栈。
通过读取PSP的值,OS就能够获取用户应用程序使用的堆栈,进一步地知道了在发生异常时,被压入寄存器的内容,而且还可以把其它寄存器进一步压栈。
[转]再识Cortex-M3之堆栈的更多相关文章
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- stm32和cortex M3学习内核简单总结
1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors
Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...
- ARM Cortex M3(V7-M架构)硬件启动程序 二
解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...
随机推荐
- 【mysql-server】遇到的坑
一.前提 最近因为工作原因,不得不用windows电脑,发现windows装mysql真的坑太多 23333: 二.环境 windows 环境 mysql 5.7(不建议用5.8坑更多) 三.步骤 3 ...
- WMware Vsphere取消某虚机的漂移
由于一些业务特性,有一些虚机不应该完全受集群DSR控制.下面记录一下如何更改某一虚机的漂移属性. 1.环境 VMware Vsphere web client 6.5 2.点击需要配置虚机所在的集群, ...
- The Best Books on Game Dev
https://www.goodreads.com/list/show/99288.The_Best_Books_on_Game_Dev
- reset Cisco 2960 password
详见:http://www.cahilig.net/2014/04/14/how-reset-cisco-2960-switch-password-without-losing-your-config ...
- [转]本文采用all-in-one(一体化的)安装OpenShift
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_21816375/article/details/73656494本文采用all-in-one( ...
- 第七届蓝桥杯省赛javaB组 第七题剪邮票
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...
- NGUI外包开发总结一下今天的收获
先总结一下今天的收获:在一个脚本类中对其成员变量进行初始化时,什么时候在Awake()中,什么时候在Start()中是有讲究的. 1)当成员变量会被外部脚本引用时,尤其是该成员变量是一个自己定义的非脚 ...
- C6678的PLL模块设置
这部分讲解的是Main PLL和 PLL Controller的配置,主要介绍怎样提供DSP核 C66X CorePac需要的工作时钟:C6678除了Main PLL,还有 DDR3 PLL.PASS ...
- [UE4]接口
一个椅子可以被抓起和放下,一扇门可以打开和关上.一个抽屉可以拉开和关上. 椅子.门.抽屉都可以用手拉,然后放下,但是它们的打开和关上的行为是不一样的,它们之间没有继承关系,没法共用“打开”和“关闭”的 ...
- 解决WCF“接收对 http://xxx.svc 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致"
最近在工作中新加了一个接口,本地调试的时候,直接抛出“接收对 http://xxx.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中 ...