原地址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. 2_PY基本数据类型

    python的数据类型和R差不多,但是需要注意的是字符访问方式与R不一样,另外,python中的“真”和“假”是True False(首字母大写). 1.字符串 字符串和R的定义差不多比如: data ...

  2. 20. Web proxies (网页代理 4个)

    用于评估Web应用程序漏洞的基于Java的Web代理. 它支持在运行时编辑/查看HTTP / HTTPS消息,以更改Cookie和表单字段等项. 它包括网络流量记录器,网络蜘蛛,哈希计算器和用于测试常 ...

  3. TCP建立与断开连接、socket通讯模板

    在传输层,有一个重点是TCP传输时建立连接的三次"握手"和四次"挥手",因为socket工作于应用层和传输层之间,故而涉及到建立连接和关闭连接的过程,以下笔记可 ...

  4. EXCEL日期格式要双击一下单元格才变正确格式

    今天遇到标题问题,问度娘后看到一个大神的解答,特此记录整理. 步骤1:在excel中把文本格式日期改为想要的日期格式 步骤2:在旁边空格中输入1,并设置成日期格式,变成1900/1/1: 步骤3:复制 ...

  5. python,pil库的小应用

    <pre>#euraxluo 5.15 #obj_1#跳一跳的外挂 from PIL import Image import subprocess import time import r ...

  6. a标签通过浏览器下载远程图片

    <a href="http://fooku.oss-cn-hongkong.aliyuncs.com/image/store/2nblHVyB6cWyBI7Aq2SEp6aZRBlui ...

  7. Dynamics 365—脚本

    Xrm.Page.getAttribute() 转控件:controls.get(0) 取赋值:getValue(),setValue() 是否改动:getIsDirty() 表单载入时的值:getI ...

  8. SQL :“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确” 错误

    其中在DAL层调用存储过程来插入数据的参数 SqlParameter[] parameters = {                                            new S ...

  9. Spring常用的三种注入方式

    好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...

  10. 使用PROC TRANSPOSE过程步对数据集进行转置时如何保持日期变量的时间顺序

    有一个数据集如下所示: 如果直接进行转置. SAS程序: proc transpose data=test out=outx1 (drop=_name_); by id; var amount; id ...