ARM Cortex-M3/M4初学习(未完待续)

ARM Cortex-M3/M4初学习

0. 架构与核心特性

0.1 指令集架构

  • 基于ARMv7-M架构,支持Thumb-2指令集(混合16/32位指令集)
  • 基于哈佛架构,数据和指令分布存储独立的空间中

0.2 流水线

  • 三级流水线: 取值(Fetch) - 译码(Decode) - 执行(Execute)
  • 这种结构在简化设计和降低功耗的同时,仍然能够提供足够的处理能力。

0.3 总线结构

  1. I-bus(Instruction Bus,指令总线):

用于从代码存储器(如 Flash 或 ROM)中读取指令。

  1. D-bus(Data Bus,数据总线):

用于从内存(如 SRAM)或外设寄存器中读写数据。

  1. S-bus(System Bus,系统总线):

用于访问 内存映射的外设系统控制块(SCB)调试接口

  1. 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-开源电子网

Keil系列教程12_map文件全面解析 - 知乎

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架构基本寄存器_xpsr-CSDN博客

posted @ 2025-04-08 18:47  林接接  阅读(337)  评论(0)    收藏  举报