Cortex-M3-STM32F1 开发:(十一)ARM Cortex-M 内核中的 MPU 和 FPU

上一篇 下一篇
F1 的时钟系统

一、MPU

Memory Protection Unit:内存保护单元

MPU 是一个集成在处理器核心内部的硬件模块,用于监控和控制处理器对内存区域的访问权限。它将物理内存划分为多个"区域"(Regions),并为每个区域设置详细的访问规则。

① 核心功能:

  • 内存区域划分:
    • 可以定义多个内存区域(如 Flash、SRAM、外设寄存器、堆栈等)。
    • 每个区域可以设置起始地址、大小和属性。
  • 访问权限控制:
    • 特权/用户模式访问:例如只允许操作系统内核(特权模式)访问某些关键内存,而用户任务(用户模式)无法访问。
    • 读写执行权限:
      • 可配置为只读、只写、读写、不可访问。
      • 可设置是否允许代码执行(XN, eXecute Never),防止数据区被当作代码运行,抵御缓冲区溢出攻击。
    • 共享/非共享:控制多核系统中的内存一致性。
  • 内存类型和缓存策略:
    • 定义内存是普通 RAM、设备内存(外设寄存器)还是强序内存。
    • 设置缓存策略(如回写、直写、不可缓存),确保对外设访问的正确性。

② 工作原理:

当处理器尝试访问某个内存地址时,MPU 会检查该地址所属的区域及其访问规则。如果访问违反了设定的权限(如用户模式写入只读区域),MPU 会触发一个 MemManage Fault 异常,由操作系统或故障处理程序决定如何处理(如终止违规任务)。

③ 主要用途:

  • 增强系统可靠性:防止一个任务(或buggy代码)破坏另一个任务或操作系统的内存。
  • 支持 RTOS:实现任务间的内存隔离,是构建稳定多任务系统的基础。
  • 安全防护:通过 XN 位防止恶意代码注入和执行。
  • 调试辅助:帮助定位内存越界、野指针等错误。

④ 支持的 Cortex-M 核心:

  • Cortex-M3, M4, M7, M33, M55, M85 等中高端核心支持 MPU。
  • M0/M0+/M23 等超低功耗核心通常不包含 MPU。

二、FPU

Floating-Point Unit:浮点运算单元

FPU 是一个专门用于执行浮点数(Floating-Point)算术运算 的硬件协处理器。它直接处理 float (32位) 和 double (64位, 部分 FPU 支持) 类型的数据。

① 核心功能:

  • 硬件加速浮点运算:
    • 直接执行 +, -, *, / 等浮点运算。
    • 支持复杂的数学函数(如开方、三角函数,部分FPU支持)。
  • 专用寄存器:
    • 拥有自己的一组浮点寄存器(S0-S31 for single-precision, D0-D15 for double-precision)。
    • 有独立的浮点状态寄存器(FPSCR)。
  • 遵循 IEEE 754 标准:确保浮点计算的精度和一致性。

② 工作原理:

当编译器生成浮点运算指令时,如果存在 FPU,这些指令会被发送到 FPU 执行。FPU 在硬件层面完成计算,速度远快于用整数运算模拟浮点运算(Soft-float)。在没有 FPU 的 MCU 上可能需要调用几十甚至上百条整数指令来模拟,而在有 FPU 的 MCU 上只需几条指令即可完成。

③ 主要用途:

  • 数字信号处理 (DSP):音频、语音、滤波算法中大量使用浮点数。
  • 传感器融合:加速度计、陀螺仪、磁力计的数据融合(如卡尔曼滤波)。
  • 图形与图像处理:坐标变换、颜色空间转换。
  • 科学计算与控制算法:PID 控制、电机矢量控制、机器人运动学。
  • 机器学习 (ML) 推理:边缘AI模型(尤其是使用浮点权重的模型)的推理。

④ 支持的 Cortex-M 核心:

  • Cortex-M4F:带单精度 FPU(可选)。
  • Cortex-M7F:带双精度 FPU(通常标配)。
  • Cortex-M33F, M55F, M85F:带 FPU。
  • M0/M0+/M3/M23 等核心不支持硬件 FPU,浮点运算是通过软件库模拟的,效率很低。

相关推荐
兆龙电子单片机设计7 小时前
【STM32项目开源】STM32单片机语音分类垃圾桶-蓝牙APP
stm32·单片机·嵌入式硬件·物联网·开源·自动化·毕业设计
零涂毕业设计8 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
阿龙的工作记录9 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
ye1501277745510 小时前
220V转5V1A隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
武汉万象奥科10 小时前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机
ye1501277745511 小时前
DC24V-100V转3.3V500mA隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
Lumos6fly11 小时前
51单片机从零到实战(15)——数字时钟温度计
单片机·嵌入式硬件·51单片机
gwf21611 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
zlinear数据采集卡13 小时前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
放学校门口见14 小时前
vscode部署stm32开发调试环境
ide·vscode·stm32