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博客

ARM Cortex-M3/M4初学习(未完待续)的更多相关文章

  1. 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别

    ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...

  2. springcloud-netflix组件学习-未完待续!!!

    SpringCloud学习 Spring Cloud是什么鬼? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现 ...

  3. 浅析Oracle PL/SQL 学习--未完待续

    这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...

  4. 【tomcat】sessionId学习(未完待续)

    这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...

  5. 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)

    简介:     Treap,一种表现优异的BST 优势:     其较于AVL.红黑树实现简单,浅显易懂     较于Splay常数小,通常用于树套BST表现远远优于Splay     或许有人想说S ...

  6. jmeter 工具学习 未完待续

    about Apache JMeter是Apache组织的开源项目,是 一个纯Java桌面应用,用于压力测试和性能测试,它最初被设计用于 web应用测试,后来逐渐的扩展到其他领域 jmeter可以用于 ...

  7. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  8. 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 ...

  9. 初进MFC的世界,太奇妙。第六次作业----未完待续

    又一次的迁徙.我希望能够早些抵达. 第六次作业-未完待续!图形界面,计算器文件 本次的作业是给自己的计算器加一个可视化的窗口,我开始也是很激动和憧憬的,看了很多的界面库,发现并没有想象的那么简单,因为 ...

  10. Java开发中的23+2种设计模式学习个人笔记(未完待续)

    注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...

随机推荐

  1. STM32F407数据手册中文版,STM32F429数据参考手册中文版

    发布一个适用STM32F405XX.STM32F407XX.STM32F415XX.STM32F417XX.STM32F427XX.STM32F437XX的中文数据手册,具体内容见下图: 首页 目录 ...

  2. hadoop部署安装(四)KAFKA+SCALA

    3.8 配置scala 下载,解压 wget https://downloads.lightbend.com/scala/2.13.0-M5/scala-2.13.0-M5.tgz tar -zxvf ...

  3. C# 拓展方法( 二)——模拟拓展方法的场景

    namespace ExpandingMethodDemo{ class Program { static void Main(string[] args) { Phone ph = new Phon ...

  4. linux系统权限管理

    一.认识linux系统的文件权限 首先随便在一个目录下使用ls -l(可简写为ll)指令,就会把该目录下所有的文件和目录的权限显示出来,例如,在根目录下使用ls -l: (深蓝字:目录,白字:文件,浅 ...

  5. vue3 基础-Pinia 可能替代 Vuex 的全局数据状态管理

    Pinia 初体验 Pinia.js是由Vue.js团队核心成员开发的新一代状态管理器,使用Composition Api进行重新设计的,也被视为下一代Vuex. Pinia是一个Vue的状态管理库, ...

  6. 鸿蒙NEXT实践(二):公共事件通信实践-智能节电案例

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  7. React最新面试攻略

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  8. RPC实战与核心原理之优雅启动

    优雅启动:如何避免流量打到没有启动完成的节点? 回顾 优雅停机,就是为了让服务提供方在停机应用的时候,保证所有调用方都能"安全"地切走流量,不再调用自己,从而做到对业务无损.其中实 ...

  9. 「硬核科普」C++11锁机制三兄弟大比拼:mutex、lock_guard与unique_lock

    大家好啊,我是小康.今天咱们聊点"家常"--那些让C++程序员又爱又恨的多线程同步工具! 如果你曾经被多线程搞得头大,或者听到"死锁"就心慌,那这篇文章就是为你 ...

  10. SpringBoot3整合SpringSecurity6(五)自定义登陆页面

    大家好,我是晓凡 写在前面 在前面的文章中,我们学习了SpringSecurity 登录认证流程,对其应该有个大概印象了. 忘记的小伙伴点击下面自己复习去~ 在前面的学习中,我们使用的都是Spring ...