ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用

作为嵌入式开发领域的经典处理器内核,ARM Cortex-M3(CM3)凭借其高效能、低功耗和丰富特性,在工业控制、物联网、消费电子等领域广泛应用。而内核寄存器是我们调试代码,理解程序运行逻辑必不可少的好帮手,理解汇编是通往嵌入式高手的必经之路。下面本文从技术角度解析其核心架构与核寄存器做相关讲解。

一、内核介绍

ARM Cortex-M3是一款面向嵌入式系统的32位RISC处理器内核,采用改进型哈佛架构,通过独立指令总线(I-Code)和数据总线(D-Code)实现并行访问,同时维护统一编址的4GB线性存储空间。内核配备三级流水线(取指、译码、执行)与静态分支预测机制,结合Thumb-2指令集混合16/32位编码,在保持高代码密度(相比纯32位指令节省约30%存储空间)的同时实现单周期32位乘法等运算能力。其嵌套向量中断控制器(NVIC)支持240个中断源,硬件自动完成优先级排序与现场保护,中断响应延迟固定为12个时钟周期,中断嵌套深度无软件限制。

存储器保护单元(MPU)可划分8个独立区域,实现特权模式与用户模式的访问权限隔离,支持大小端数据格式动态切换。调试系统集成串行线/JTAG(SWJ-DP)接口,支持4个硬件断点与2个数据观察点,配合可选ETM指令追踪模块实现实时执行流记录。电源管理模块提供睡眠、深度睡眠和待机三种低功耗模式,休眠电流最低1μA,运行功耗典型值低于200μA/MHz(基于90nm工艺)。该内核通过AHB-Lite总线矩阵连接外设,支持单周期GPIO操作与位带别名访问,硬件除法器可在2-12周期内完成32位整数运算。作为首款支持非对齐内存访问的Cortex-M系列处理器,其架构平衡了实时性、能效比与开发便利性,适用于工控、IoT等实时嵌入式场景。image-20250222081336917

二、核寄存器

Cortex‐M3 处理器拥有 R0‐R15 的寄存器组。其中 R13 作为堆栈指针 SP。SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。如下图所示的R13寄存器,分为主堆栈指针(MSP)、进程堆栈寄指针(PSP)。

image-20250222080644783

R0-R12:通用寄存器

R0‐R12 都是 32 位通用寄存器,用于数据操作。但是注意:绝大多数 16 位 Thumb 指令只能访问 R0‐R7,而 32 位 Thumb‐2 指令可以访问所有寄存器。首先在程序的调用过程中,R0-R3寄存器都存储着调用函数的传参值,下一个函数用到了几个参数,就提前将参数存储在r0-r3里面,如果超出4个参数,就将多余的参数Push进堆栈中,在进入到调用的函数里面后,在Pop出栈给其他r4-r12寄存器。

下面我们举个例子,函数我是用函数指针的形式写的,你就把他当成调用一个函数,其中ptDevice,x,y,1都是传参。我们看下面的汇编代码,将1给到r3,将y给到r2,将x给到r1,最后将ptDevice给到r0,之后执行BLX跳转指令,进入到该函数中。

image-20250222082843251

image-20250222083005770

Banked R13: 两个堆栈指针

Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。

  • 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
  • 进程堆栈指针(PSP):由用户的应用程序代码使用。

如下图,在STM32 F103芯片中,我们能看到这两个SP寄存器。之后我会单独出一章讲解MSP和PSP使用的场景,这里不做细讲。

image-20250222083515384

堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。

在 ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的 fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。

R14:连接寄存器(LR)

当呼叫一个子程序时,由 R14 存储返回地址。

不像大多数其它处理器,ARM 为了减少访问内存的次数(访问内存的操作往往要 3 个以上指令周期,带 MMU和 cache 的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有 1 级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于 1 级,则需要把前一级的 R14 值压到堆栈里。在 ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在 RISC 处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。

下面我们也再看一个例子,如下图所示,在我们调用函数的时候,会将函数执行完返回下一行指令存储在R14寄存器中,当执行完该函数后,就跳转回R14寄存器,即该函数执行完的下一行代码。执行完该跳转指令后的下一行指令的地址是0x08001CA6,此时将0x08001CA6的值存储在R14寄存器中,等待函数执行完,返回。由于Cortex M使用的是Thumb指令,地址跳转的指令需要加1,即08001CA7存储在R14寄存器中。

image-20250222083944642

R15:程序计数寄存器–PC

指向当前的程序地址。如果修改它的值,就能改变程序的执行流。

其实就是程序跑到了哪里,R15就执行哪里,如下图所示。

image-20250222084255528

特殊功能寄存器

Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括程序状态字寄存器组(PSRs)中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)控制寄存器(CONTROL)

image-20250222081705516

image-20250222081716791

下图我们介绍一下STM32 F103的特殊寄存器,当我们执行CMP,BLE,CBZ等等这些汇编代码时,这些代码执行完都会影响状态寄存器xPSR中的值,给后续汇编代码执行其他跳转、比较或者其他汇编指令的时候提供条件判断。

image-20250222084331337

image-20250222084342480

下面我们就用一张STM32F1xx系列的Cortex M3的芯片将上面的核寄存器的图片进行总结:

image-20250222082211825

image-20250222082219195

image-20250222082228873

image-20250222090734765

三、总结

Cortex-M3通过架构级优化(哈佛总线、Thumb-2指令集)与系统级增强(MPU、NVIC),在性能与功耗之间实现平衡。其完善的调试生态(Keil MDK、IAR Embedded Workbench支持)进一步降低开发门槛,成为中高端嵌入式应用的经典选择。后续的Cortex-M4/M7等系列虽在DSP/浮点性能上强化,但M3仍凭借性价比占据重要市场地位。后续我会分享更多有关嵌入式和ARM内核方面的知识,希望大家多多关注。


扩展阅读建议

  • ARMv7-M架构手册(了解指令集细节)
  • 《Cortex-M3权威指南》(Joseph Yiu著)
  • CMSIS标准库应用(统一外设驱动接口)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS ur10机械臂添加140夹爪全流程记录

ROS ur10机械臂添加140夹爪 系统版本:Ubuntu20.04 Ros版本:noetic Moveit版本:moveit-noetic 参考博客: ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例&#xf…

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时,添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为,我们可以将已登录状态的Cookies存储起来,并在下次自动化测试或爬虫任务中直接加载这些Cookies,从而跳过登录步骤。 Cookies简介 …

【落羽的落羽 数据结构篇】树、二叉树

文章目录 一、树1. 树的概念和结构2. 树的相关术语 二、二叉树1. 概念与结构2. 满二叉树3. 完全二叉树4. 二叉树的性质5. 二叉树的存储结构 一、树 1. 树的概念和结构 之前我们学习了线性表,今天我们再来接触一种全新的数据结构——树。 树是一种非线性的数据结构…

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…

Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因

Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因 一、背景二、查看topic日志信息三、结论四、解决方法一、背景 源头数据库在很短的时间内刷了大量的数据,部分数据在hdfs丢失了 理论上debezium数据采集不会丢失,就需要排查数据链路某个节点是否有数据丢失。 数据…

llama.cpp 一键运行本地大模型 - Windows

文章目录 llama.cpp 一键运行本地大模型 - Windows嘿&#xff0c;咱来唠唠 llama.cpp 这玩意儿&#xff01;gguf 格式是啥&#xff1f;咱得好好说道说道基座模型咋选&#xff1f;所需物料&#xff0c;咱得准备齐全咯核心命令&#xff0c;得记牢啦运行方式咋选&#xff1f;测试应…

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…

Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误

01.E1696 E1696 无法打开源文件 “stdio.h” 解决方法&#xff1a; 更新一下SDK 1&#xff09;打开Visual Studio Installer&#xff0c;点击修改 2&#xff09;安装详细信息中自己系统对应的SDK&#xff0c;点击修改即可 02.WinError 10060 方法来源 解决方法&#xff1a…

labview关于计时器的使用

通过使用计时器函数&#xff0c;可以对采集和保存实现很好的控制&#xff0c;因为之前通过等待函数有出现程序卡死的情况&#xff0c;这里用到定时器函数来实现时间控制。 根据用户输入的采集频率&#xff0c;和采集的单位来确定是否上次采集的时间间隔减去这次计时器的时间是…

go语言环境下载与配置(Windows)

下载 Go下载 - Go语言中文网 - Golang中文社区 建议在D盘中创建文件夹安装到 D 盘 &#xff0c;方便进行管理&#xff0c;然后进行傻瓜式安装。 安装 验证安装 go version 安装成功 配置环境变量 winE --> 右击此电脑 --> 选择属性 --> 高级系统设置 --> 点击…

低延迟,高互动:EasyRTC的全场景实时通信解决方案

在数字化时代&#xff0c;实时通信技术已成为连接人与人、人与设备的重要桥梁。无论是在线教育、远程医疗、智能家居&#xff0c;还是企业协作&#xff0c;高效的实时互动体验都是提升效率和满意度的关键。而 EasyRTC&#xff0c;作为领先的实时通信解决方案&#xff0c;凭借其…

车载诊断架构 --- LIN节点路由转发注意事项

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

浏览器深度解析:打造极速、安全、个性化的上网新体验

在数字化时代,浏览器作为我们获取信息、娱乐休闲的重要工具,其性能与功能直接影响着我们的上网体验。今天,我将为大家介绍一款备受好评的浏览器——Yandex浏览器,并深入解析其独特功能与优势,帮助大家更好地了解并选择这款上网神器。 一、知名公司背书,开源项目融合 Yan…

vite react 项目打包报错处理

Could not find a declaration file for module lodash 安装 Lodash 类型声明文件 # 使用 npm npm install --save-dev types/lodash# 使用 yarn yarn add -D types/lodash 打包成功

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

[实现Rpc] 测试 | rpc部分功能联调 | debug | 理解bind

目录 服务端 客户端 Debug 运行 总结 服务端 调用 on Request 对请求做出回应 on 对...做处理 #include "../../common/net.hpp" #include "../../common/message.hpp" #include "../../common/dispatcher.hpp" #include "../../se…

LeetCode每日精进:622.设计循环队列

题目链接&#xff1a;622.设计循环队列 题目描述&#xff1a; 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个…

网络安全学习-常见安全漏洞检测以及修复方法-1

渗*透测试 渗透测试就是模拟攻击者入侵系统&#xff0c;对系统进行一步步渗透&#xff0c;发现系统的脆弱环节和隐藏风险。形成测试报告提供给系统的所有者&#xff0c;所有者根据报告对系统进行加固&#xff0c;提升系统的安全性&#xff0c;防止真正的攻击者入侵。 渗透测试…

鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar)

鸿蒙开发深入浅出01&#xff08;基本环境搭建、页面模板与TabBar&#xff09; 1、效果展示2、下载 DevEco Studio3、创建项目4、新建页面模板5、更改应用信息6、新建以下页面7、Index.ets8、真机运行9、图片资源文件 1、效果展示 2、下载 DevEco Studio 访问官网根据自己的版本…