ARM Cortex-M3/M4初学习(未完待续)
ARM Cortex-M3/M4初学习
0. 架构与核心特性
0.1 指令集架构
- 基于ARMv7-M架构,支持Thumb-2指令集(混合16/32位指令集)
- 基于哈佛架构,数据和指令分布存储在独立的空间中
0.2 流水线
- 三级流水线: 取值(Fetch) - 译码(Decode) - 执行(Execute)
- 这种结构在简化设计和降低功耗的同时,仍然能够提供足够的处理能力。
0.3 总线结构
- I-bus(Instruction Bus,指令总线):
用于从代码存储器(如 Flash 或 ROM)中读取指令。
- D-bus(Data Bus,数据总线):
用于从内存(如 SRAM)或外设寄存器中读写数据。
- S-bus(System Bus,系统总线):
用于访问 内存映射的外设、系统控制块(SCB) 和 调试接口。
- DMA:(不一定存在)stm32f1,f4系列均有,一般每个DMA有8个 stream 流,其中f4系列的DMA具有FIFO
1. 寄存器组

| 寄存器 | 说明 | 分组 |
|---|---|---|
| R0 | 通用寄存器 | Low Registers |
| R1 | 通用寄存器 | Low Registers |
| R2 | 通用寄存器 | Low Registers |
| R3 | 通用寄存器 | Low Registers |
| R4 | 通用寄存器 | Low Registers |
| R5 | 通用寄存器 | Low Registers |
| R6 | 通用寄存器 | Low Registers |
| R7 | 通用寄存器 | Low Registers |
| R8 | 通用寄存器 | High Registers |
| R9 | 通用寄存器 | High Registers |
| R10 | 通用寄存器 | High Registers |
| R11 | 通用寄存器 | High Registers |
| R12 | 通用寄存器 | High Registers |
| R13 | 主堆栈指针 (MSP) ,R13 (PSP) 为进程堆栈指针 (PSP) | - |
| R14 | 连接寄存器 (LR) | - |
| R15 | 程序计数器 (PC) | - |
1.1 通用寄存器:R0-R12(共13个)
- 低组寄存器(Low Registers):
R0-R7 为低组寄存器,所有指令都可以访问(共8个)
- 高组寄存器(High Registers):
R8-R12为高组寄存器,只有32位Thumb指令和很少的16位Thumb指令能访问(共5个)
1.2 堆栈指针:SP(R13)
cm3/cm4内核有两个SP,分别是MSP(主堆栈指针)和PSP(进程堆栈指针),共用寄存器地址
主 堆栈指针(MSP):
用于 特权模式(Handler Mode) 和 异常 / 中断处理。
由硬件自动切换,例如进入中断服务程序(ISR)时,处理器强制使用 MSP。
裸机默认只使用MSP
进程堆栈指针(PSP):
- 用于 用户模式(Thread Mode),通常运行应用程序或用户任务。
- 需手动配置,适用于多任务系统中不同任务的堆栈隔离。
- 常用于RTOS中
示例:FreeRTOS中是怎么使用MSP和PSP的
场景 使用的堆栈指针 说明 系统启动 MSP 默认模式,初始化阶段使用 用户任务运行 PSP 每个任务独立堆栈,由调度器管理 中断 / 异常处理 MSP 保证内核稳定性,隔离任务堆栈 任务切换(PendSV) PSP → MSP → PSP 保存旧任务 PSP,加载新任务 PSP 特权 API 调用 PSP(短暂切换) 通过 SVC 或直接寄存器操作
1.3 链接寄存器:LR
- 连接调用子程序(中断or异常or函数)时存储的返回地址
- 可以用于栈回溯调试
1.4 程序计数器:PC
- 指向当前程序运行的指令的地址
1.5 程序状态寄存器:xPSR
等我有时间学一下
2. 寄存器用途
- R0 到 R3:前4个函数参数使用R0-R4传参,超出部分通过堆栈传递
- R4 到 R11:局部变量,保存上下文,被调用者保存的寄存器。
- R12:临时寄存器,调用者保存的寄存器。
- SP:栈指针。
- LR:链接寄存器,用于保存返回地址。
- PC:程序计数器。
3. 堆栈
这里讨论的C语言中的堆栈,不是RTOS中的堆栈
堆栈的空间均分配在RAM中,一般可以通过修改启动文件来修改栈的大小
3.1 堆
- cm3/cm4中堆向上生长
- 由程序员分配,效率低
3.2 栈
栈一般是函数调用中会使用,所以过度递归会导致爆栈
由程序自动分配,效率高
cm3/cm4中栈向上生长
栈的最大调用深度可以通过MDK生成的htm文件查看(估计值)
KEIL MDK .map文件分析(必学知识点) - 正点原子倾力打造!-OpenEdv-开源电子网
4. CM3与CM4的区别
| 特性 | Cortex-M3 | Cortex-M4 |
|---|---|---|
| 指令集 | Thumb-2(支持部分 16/32 位指令) | Thumb-2 + DSP 扩展指令集 |
| 浮点单元(FPU) | 不支持 | 可选单精度 FPU(IEEE 754) |
| DSP 指令 | 无 | 支持乘加(MAC)、SIMD、饱和运算 |
| 硬件除法器 | 支持(32 位除法的周期数更多) | 优化除法周期(部分型号) |
5. 什么是哈佛架构?
- 定义:将程序指令和数据存储在两个独立的内存中的体系结构。
- 特点:
- 分离存储器:指令和数据各自有独立的存储空间。
- 独立总线:使用分开的总线分别传输指令和数据,允许同时访问指令和数据(并行)。
- 提高性能:通过并行访问指令和数据,增强系统的处理速度。
- 硬件复杂:需要两个独立的存储器和总线,硬件复杂性较高
参考链接
《嵌入式软件的时间分析》Cortex-M3的三级流水线与分支预测【阅读笔记3】 - 汽车电子 - 电子工程世界-论坛
ARM Cortex-M3/M4初学习(未完待续)的更多相关文章
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...
- springcloud-netflix组件学习-未完待续!!!
SpringCloud学习 Spring Cloud是什么鬼? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现 ...
- 浅析Oracle PL/SQL 学习--未完待续
这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...
- 【tomcat】sessionId学习(未完待续)
这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...
- 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)
简介: Treap,一种表现优异的BST 优势: 其较于AVL.红黑树实现简单,浅显易懂 较于Splay常数小,通常用于树套BST表现远远优于Splay 或许有人想说S ...
- jmeter 工具学习 未完待续
about Apache JMeter是Apache组织的开源项目,是 一个纯Java桌面应用,用于压力测试和性能测试,它最初被设计用于 web应用测试,后来逐渐的扩展到其他领域 jmeter可以用于 ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- 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 ...
- 初进MFC的世界,太奇妙。第六次作业----未完待续
又一次的迁徙.我希望能够早些抵达. 第六次作业-未完待续!图形界面,计算器文件 本次的作业是给自己的计算器加一个可视化的窗口,我开始也是很激动和憧憬的,看了很多的界面库,发现并没有想象的那么简单,因为 ...
- Java开发中的23+2种设计模式学习个人笔记(未完待续)
注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...
随机推荐
- STM32F407数据手册中文版,STM32F429数据参考手册中文版
发布一个适用STM32F405XX.STM32F407XX.STM32F415XX.STM32F417XX.STM32F427XX.STM32F437XX的中文数据手册,具体内容见下图: 首页 目录 ...
- hadoop部署安装(四)KAFKA+SCALA
3.8 配置scala 下载,解压 wget https://downloads.lightbend.com/scala/2.13.0-M5/scala-2.13.0-M5.tgz tar -zxvf ...
- C# 拓展方法( 二)——模拟拓展方法的场景
namespace ExpandingMethodDemo{ class Program { static void Main(string[] args) { Phone ph = new Phon ...
- linux系统权限管理
一.认识linux系统的文件权限 首先随便在一个目录下使用ls -l(可简写为ll)指令,就会把该目录下所有的文件和目录的权限显示出来,例如,在根目录下使用ls -l: (深蓝字:目录,白字:文件,浅 ...
- vue3 基础-Pinia 可能替代 Vuex 的全局数据状态管理
Pinia 初体验 Pinia.js是由Vue.js团队核心成员开发的新一代状态管理器,使用Composition Api进行重新设计的,也被视为下一代Vuex. Pinia是一个Vue的状态管理库, ...
- 鸿蒙NEXT实践(二):公共事件通信实践-智能节电案例
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- React最新面试攻略
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- RPC实战与核心原理之优雅启动
优雅启动:如何避免流量打到没有启动完成的节点? 回顾 优雅停机,就是为了让服务提供方在停机应用的时候,保证所有调用方都能"安全"地切走流量,不再调用自己,从而做到对业务无损.其中实 ...
- 「硬核科普」C++11锁机制三兄弟大比拼:mutex、lock_guard与unique_lock
大家好啊,我是小康.今天咱们聊点"家常"--那些让C++程序员又爱又恨的多线程同步工具! 如果你曾经被多线程搞得头大,或者听到"死锁"就心慌,那这篇文章就是为你 ...
- SpringBoot3整合SpringSecurity6(五)自定义登陆页面
大家好,我是晓凡 写在前面 在前面的文章中,我们学习了SpringSecurity 登录认证流程,对其应该有个大概印象了. 忘记的小伙伴点击下面自己复习去~ 在前面的学习中,我们使用的都是Spring ...