原地址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. 数据看板superset在Windows环境下安装

    @https://www.cnblogs.com/calmzeal/archive/2017/08/14/7359144.html 以下是我的安装版本与安装步骤: 1. 安装Python 3.7 ,  ...

  2. 解决jenkins git timeout的问题

    进入项目配置(project configure) "源码管理"选项卡中,找到Additional Behaviours点击旁边的 add   image.png 点击advanc ...

  3. 时间复杂度O()与KMP算法

    要得到某个结果,可以有很多种方式,算法就是为了寻找一条最快的方式. 而评判其好坏的标准就是时间复杂度. O(1): 我们把执行一次的时间复杂度定义为O(1) sum = a +b; cout < ...

  4. linux下钉钉,微信

    google-chrome --app=https://im.dingtalk.com/ google-chrome --app=https://wx.qq.com/

  5. 常用LINQ关键字用法汇总

    背景 传统上,针对数据的查询都以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持.此外,还需要针对每种数据源学习一种不同的查询语言:SQL 数据库.XML 文档.各种 Web ...

  6. Centos 7 64位 minimal 最小化安装的系统中静默安装oracle 11g r2

    1:安装好centos 7 操作系统: 虚拟机安装centos 7,在vmware中一步步来就可以成功. 2:安装vim 最小化安装的系统只有vi编辑器,这里装一下vim,个人习惯,可以不安装, 那么 ...

  7. ADO.Net操作数据库的方式

    1.使用数据提供程序执行sql或者ddl语句操作数据库. 2.使用oledb操作数据库 3.使用odbc操作数据库 4.使用DataSet操作数据库 前面3种方式都无法避免要使用sql语句,对不同种类 ...

  8. PHP 概览

    运行环境 Windows Linux  Centos Ubuntu MacOS 编辑器 编码风格 依赖管理 Composer 发布包 热门框架 热门类库 热门系统 架构支持 源码分析 扩展开发

  9. 知识点:Mysql 数据库索引优化实战(4)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...

  10. atom插件

    1.Sync Settings 搭配github,同步你的atom插件信息,配置信息,让你轻松实现一台电脑配置,多台电脑共享. 2.Emmet 能够基于Emmet语法产生HTML,做过前段开发的不会不 ...