Cortex-M3-寄存器
Cortex-M3-寄存器
- Cortex‐M3 处理器拥有 R0‐R15 的寄存器组。其中 R13 作为堆栈指针 SP。SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。
R0-R12:通用寄存器
- R0‐R12 都是 32 位通用寄存器,用于数据操作。但是注意:绝大多数 16 位 Thumb 指令只能访问 R0‐R7,而 32 位 Thumb‐2 指令可以访问所有寄存器。
Banked R13: 两个堆栈指针
- Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。
- 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
- 进程堆栈指针(PSP):由用户的应用程序代码使用。
- 堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。
- 要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用 MSP就够了。堆栈指针用于访问堆栈,并且 PUSH 指令和 POP 指令默认使用 SP。
- 在 ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的 fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统用)。
R14:连接寄存器
- 当呼叫一个子程序时,由 R14 存储返回地址
- R14 是连接寄存器(LR)。在一个汇编程序中,你可以把它写作 both LR 和 R14。LR 用于在调用子程序时存储返回地址。例如,当你在使用 BL(分支并连接,Branch and Link)指令时,就自动填充 LR 的值。
- 尽管 PC 的 LSB 总是 0(因为代码至少是字对齐的),LR 的 LSB 却是可读可写的。这是历史遗留的产物。在以前,由位 0 来指示 ARM/Thumb 状态。因为其它有些 ARM 处理器支持ARM 和 Thumb 状态并存,为了方便汇编程序移植,CM3 需要允许 LSB 可读可写
- 不像大多数其它处理器,ARM 为了减少访问内存的次数(访问内存的操作往往要 3 个以上指令周期,带 MMU和 cache 的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有 1 级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于 1 级,则需要把前一级的 R14 值压到堆栈里。在 ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在 RISC 处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。。
R15:程序计数寄存器,也就是PC指针
- 指向当前的程序地址。如果修改它的值,就能改变程序的执行流。
- 在汇编代码中你也可以使用名字“PC”来访问它。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。比如说:
0x1000: MOV R0, PC ; R0 = 0x1004
- 如果向 PC 中写数据,就会引起一次程序的分支(但是不更新 LR 寄存器) )。CM3 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。然而,在分支时,无论是直接写 PC 的值还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),用以表明这是在Thumb 状态下执行。倘若写了 0,则视为企图转入 ARM 模式,CM3 将产生一个 fault 异常。
特殊功能寄存器
- Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括程序状态字。
- 寄存器组(PSRs)。
- 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)。
- 控制寄存器(CONTROL)。
注:
- MSB是Most Significant Bit的缩写,指最高有效位;
- LSB是least significant bit的缩写,指最低有效位;
拓展:关于R15,PC指针描述
- 不管是ARM状态还是Thumb状态,至少都是半字对齐,ARM状态是字对齐.
- 区别在于寻址之后,对程序指针 PC,也就是R15的处理,Thumb状态的寻址之后,PC值尾位自己置1.ARM状态尾位不动.
- 而Thumb2指令集,也是如此,Thumb2编译出的函数,地址是半字对齐的,也可能是字对齐,即同时兼容了前ARM内核的状态,但是,不过是半字对齐还是字对齐,都将PC尾位置1.
- 所以,你一定是读取了PC的值,如果你直接读取函数的地址,不可能出现函数在奇数的情况.
Cortex-M3-寄存器相关推荐
- Cortex M3寄存器组
寄存器组 宗旨:技术的学习是有限的,分享的精神是无限的. 1.通用目的寄存器R0~R7 R0-R7 也被称为低组寄存器.所有指令都能访问它们.它们的字长全是 32 位,复位后的初始值是不可预料的. 2 ...
- Cortex M3 NVIC与中断控制
Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神是无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断 ...
- cortex m3的操作模式和状态
1.操作状态(operation state): debug state:处理器在调试器发起halt或匹配到断点时,会进入debug state并停止执行指令. thumb state:处理器正在运行 ...
- Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)
架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...
- Cortex‐M3的Faults异常究竟是什么?
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...
- Cortex‐M3和Cortex‐M0是否都能位带操作
最近在进行stm32l011f4的编程,想到stm32有位带操作,便想试一试,但是事与愿违,先贴下位带操作代码 Cortex‐M0的位带操作代码 //IO输出方向设置 #define SDA_IN() ...
- Cortex M3内核架构
CortexM3内核架构 宗旨:技术的学习是有限的,分享的精神是无限的. 1.ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元( CPU). 完整的基于CM3的MCU ...
- Cortex M3 Bit-banding简介
http://blog.csdn.net/shevsten/article/details/7676397 Cortex M3 Bit-banding简介 分类: ARM MCU2012-06-19 ...
- cortex m3 开源_开源增强现实耳机,Steam的125M有效帐户等
cortex m3 开源 您好,开放游戏迷! 在本周的版本中,我们将了解Steam的1.25亿活跃帐户和Game Developers Conference,这是一个开源增强现实头戴设备,Linux游 ...
- Cortex M3处理器工作模式及中断过程
来自::http://blog.csdn.net/ffgamelife/article/details/6947300 1. 工作模式 线程模式(Thread mode):处理器复位或异常退 ...
最新文章
- Linux系统下的Nginx的缓存设置、压缩配置和自动列目录配置
- flirtlib 测试过程
- Programming Computer Vision with Python (学习笔记六)
- php mysql 条件查询语句_where 查询条件-Medoo - 高效的轻量级PHP数据库框架, 提高开发效率!...
- 圆形渐变shader_Flutter 中渐变的高级用法
- 云安全的新战场上,要靠什么来抵御威胁
- 英特尔推出业界领先的AI与数据分析平台,全新处理器、内存、存储、FPGA解决方案集体亮相
- 如何数分钟创建并成功运行数千台云主机?
- android UDP通信
- java处理excel的读写
- Glide的图像centerCrop处理-长短边适配
- python建模概述
- 苹果内核H5网页漫画小说系统源码+支持对接公众号
- linux下golang protoc安装详细教程
- 一杯咖啡带你读懂状态机
- Tmux(-yank,-cssh,-xpanes)使用指南
- 程序设计思维与实践 Week15 实验
- CPU卡PSAM卡 响应指令
- TIA WinCC Professional入门经典(2) 创建画面与联合仿真
- Java编程序哥德巴赫猜想
热门文章
- Qt官方开发环境生成的exe发布方式--使用windeployqt
- Using join buffer (Batched Key Access)
- mysql安装完成后登入错误
- vmware Failed to initialize remote display subsystem
- python学习笔记——类
- 批处理判断文件夹是否存在
- Spring AOP 本质(3)
- “脚踢各大Python Web框架”,Sanic真有这能耐么?
- iis8.5 php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
- mysql增删改查 工具类_Hibernate增删改查数据库之二工具类