原地址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之堆栈的更多相关文章

  1. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  2. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  3. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

  4. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

  5. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  6. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  7. 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 ...

  8. 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别

    ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...

  9. ARM Cortex M3(V7-M架构)硬件启动程序 二

    解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...

随机推荐

  1. 【mysql-server】遇到的坑

    一.前提 最近因为工作原因,不得不用windows电脑,发现windows装mysql真的坑太多 23333: 二.环境 windows 环境 mysql 5.7(不建议用5.8坑更多) 三.步骤 3 ...

  2. WMware Vsphere取消某虚机的漂移

    由于一些业务特性,有一些虚机不应该完全受集群DSR控制.下面记录一下如何更改某一虚机的漂移属性. 1.环境 VMware Vsphere web client 6.5 2.点击需要配置虚机所在的集群, ...

  3. The Best Books on Game Dev

    https://www.goodreads.com/list/show/99288.The_Best_Books_on_Game_Dev

  4. reset Cisco 2960 password

    详见:http://www.cahilig.net/2014/04/14/how-reset-cisco-2960-switch-password-without-losing-your-config ...

  5. [转]本文采用all-in-one(一体化的)安装OpenShift

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_21816375/article/details/73656494本文采用all-in-one( ...

  6. 第七届蓝桥杯省赛javaB组 第七题剪邮票

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...

  7. NGUI外包开发总结一下今天的收获

    先总结一下今天的收获:在一个脚本类中对其成员变量进行初始化时,什么时候在Awake()中,什么时候在Start()中是有讲究的. 1)当成员变量会被外部脚本引用时,尤其是该成员变量是一个自己定义的非脚 ...

  8. C6678的PLL模块设置

    这部分讲解的是Main PLL和 PLL Controller的配置,主要介绍怎样提供DSP核 C66X CorePac需要的工作时钟:C6678除了Main PLL,还有 DDR3 PLL.PASS ...

  9. [UE4]接口

    一个椅子可以被抓起和放下,一扇门可以打开和关上.一个抽屉可以拉开和关上. 椅子.门.抽屉都可以用手拉,然后放下,但是它们的打开和关上的行为是不一样的,它们之间没有继承关系,没法共用“打开”和“关闭”的 ...

  10. 解决WCF“接收对 http://xxx.svc 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致"

    最近在工作中新加了一个接口,本地调试的时候,直接抛出“接收对 http://xxx.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中 ...