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. 解决多个if-else的方案

    参考链接: 遇到大量if记住下面的口诀: 互斥条件表驱动 嵌套条件校验链 短路条件早return 零散条件可组合 解释: 互斥条件,表示几个条件之间是冲突的,不可能同时达成的.比如说一个数字,它不可能 ...

  2. Vue(六)——条件渲染

    Vue--条件渲染 v-if.v-else-if.v-else v-if 指令用于条件性地渲染一块内容,表达式的值为 true --渲染. false--不渲染 v-if.v-else-if.v-el ...

  3. 详解SLAM中的李群和李代数(上)

    1 概述 最近阅读高翔大神的<视觉SLAM十四讲>这本书,感觉整本书写的非常的平实,用非常接地气的语言毫无保留的介绍了视觉SLAM的相关知识,非常值得一读.不过,在第4章出现的李群和李代数 ...

  4. heapdump敏感信息提取工具-heapdump_tool(二),附下载链接。

    ​ heapdump敏感信息查询工具,例如查找 spring heapdump中的密码明文,AK,SK等 下载链接: heapdump_tool下载链接:heapdump_tool下载 声明: 此工具 ...

  5. 【笔记】reko 0.10.2 反编译工具安装和使用记录|(1) README.md

    (翻译自README.md,并通过自己的实际操作情况重新整理了一遍) 笔者注:我已经成功地根据README.md下载了Release版本,也自己试了下从源码编译,跟着README都挺顺利的.如果操作过 ...

  6. 挑战零基础用CodeBuddy做一款音视频处理软件

    朋友们,我最近不是一直在捣鼓小软件嘛!手头这个叫TransDuck的音视频处理工具刚有点小爆的趋势,反馈意见里也是收到不少关于SaaS版本的问题,比如: "翻译效果真的顶!但每次上传比较大的 ...

  7. 将Spring Boot项目部署到自己的服务器上

    第一步: 先准备好MobaXterm,链接上服务器后进入宝塔面板 https://www.bt.cn/new/download.html 找到Linux面板安装脚本复制命令 第二步: 进入MobaXt ...

  8. Median of Two Sorted Arrays---LeetCode进阶路④

    题目描述 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  9. 如何实现RAG与MCP集成

    1.概述 在人工智能的创新浪潮中,检索增强生成(RAG)技术以其高效调用外部知识.提升生成内容准确性的能力备受瞩目,而模型上下文协议(MCP)则为不同模型间的交互与协同提供了标准框架.当 RAG 的知 ...

  10. linux服务器常用硬件查询操作

    查看服务器内存条数 [root@test ~]# dmidecode |grep -P -A5 "Memory\s+Device" |grep Size |grep -v Rang ...