总览


一、Cortex-M 系列家族划分
ARM Cortex-M 系列核心按照性能、指令集、特性可分为多个型号:
| 架构核心 | 发布年份 | 代表特性 | 典型芯片平台 |
|---|---|---|---|
| Cortex-M0 | 2009 | 超低功耗、ARMv6-M 内核 | STM32F0, NXP LPC800 |
| Cortex-M0+ | 2012 | 优化功耗与指令执行路径 | STM32G0, Kinetis L |
| Cortex-M3 | 2006 | 基于 ARMv7-M,性能提升明显 | STM32F1, EFM32 |
| Cortex-M4 | 2010 | DSP 指令 + 单精度 FPU 支持 | STM32F3/F4, Kinetis K |
| Cortex-M7 | 2014 | 双发射流水线,高性能 | STM32F7, H7 系列 |
| Cortex-M23/M33 | 2016+ | TrustZone 安全扩展,ARMv8-M 架构 | 多家 ARMv8-M 芯片 |
Cortex-M 核心设计理念:
-
简化开发模型:线性地址空间、统一 NVIC、无需 MMU。
-
高效中断响应:中断延迟低于 12 个时钟周期。
-
Thumb 指令集支持:高密度指令,节省 Flash。
-
低功耗模式支持:SLEEP / DEEPSLEEP / STOP / STANDBY。
典型工程应用建议:
| 应用场景 | 推荐核心 | 原因 |
|---|---|---|
| 简单 IO 控制 / 低功耗 | M0+ | 指令集简单、功耗低,适合小型控制任务 |
| 普通 RTOS 应用 | M3 | Thumb-2 支持完整,性能足够,生态成熟 |
| 电机控制 / 音频滤波 | M4 | DSP + FPU 优势明显,配合 CMSIS-DSP 最佳 |
| 实时音视频传输 / GUI | M7 | 高频 + Cache 支持,处理能力强 |
Cortex-M 系列性能特征对比
| 特性 | Cortex-M0 | Cortex-M3 | Cortex-M4 | Cortex-M7 |
|---|---|---|---|---|
| 指令宽度 | Thumb 16-bit | Thumb-2 | Thumb-2 + DSP | Thumb-2 + DSP + FPU |
| 流水线深度 | 3-stage | 3-stage | 3-stage | 6-stage dual-issue |
| FPU | 无 | 无 | 可选单精度 | 单精度/双精度 |
| DSP 扩展 | 无 | 无 | 有 | 有(性能更强) |
| 最大主频 | ~48 MHz | ~100 MHz | ~180 MHz | ~480 MHz(如 STM32H7 系列) |
| NVIC 可配置中断数 | 32 个 | 240 个 | 240 个 | 240 个 |
补充说明:
-
指令宽度与性能:
-
M0 系列仅支持 Thumb 16-bit 指令,指令简单,适合低功耗、小型控制任务。
-
M3/M4/M7 支持 Thumb-2(16/32 位混合),提升表达能力和执行效率。
-
M4/M7 加入 DSP 扩展,M7 更进一步支持单/双精度 FPU,提高数字信号处理和浮点运算性能。
-
-
流水线深度与吞吐能力:
-
流水线越深,可实现更高主频和指令吞吐。
-
M7 的 dual-issue(双发射)流水线,可同时发射两条指令,进一步提升运算能力。
-
-
NVIC 中断支持:
-
M0 最多 32 个外部中断,适合简单应用。
-
M3/M4/M7 支持最多 240 个外部中断,适合复杂系统和多外设场景。
-
二、内核寄存器与特殊功能寄存器
Cortex-M 系列除通用寄存器(R0~R12, SP, LR, PC)外,还有关键系统寄存器:
| 寄存器 | 描述 | 说明 |
|---|---|---|
| R0~R12 | 通用寄存器 | 函数参数、返回值、临时变量 |
| SP | Stack Pointer | MSP(主栈)或 PSP(进程栈) |
| LR | Link Register | BL 跳转返回地址 |
| PC | Program Counter | 当前指令地址 |
| xPSR | 程序状态寄存器 | APSR / IPSR / EPSR / IT / GE |
SysTick 定时器(周期调度)
| 寄存器 | 功能说明 |
|---|---|
| CTRL | 启动 / 中断使能 / 状态 |
| LOAD | 计数器初值(周期设置) |
| VAL | 当前倒计时值 |
| CALIB | 时钟校准(ms 级精度) |
示例:配置 1ms 中断
cpp
SysTick->LOAD = SystemCoreClock / 1000 - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
NVIC(嵌套向量中断控制器)
-
地址空间:0xE000E100 起
-
主要寄存器:
-
NVIC_ISER / NVIC_ICER:中断使能/禁用 -
NVIC_IPRx:中断优先级(高位有效) -
NVIC_STIR:软件触发中断
-
示例:使能 USART1 中断
cpp
NVIC_SetPriority(USART1_IRQn, 5); // 优先级越小越高
NVIC_EnableIRQ(USART1_IRQn);
中断优先级机制:
-
Preemption Priority(抢占优先级):决定是否可打断当前中断
-
Sub Priority(响应顺序):同抢占优先级下谁先响应
cpp
SCB->AIRCR = (0x5FA << 16) | (3 << 8); // PRIGROUP = 3
中断嵌套与中断屏蔽机制:
NVIC 支持同级别中断嵌套,基于以下机制:
- 当前中断可被更高优先级中断打断(Preempt)
- 可使用
__disable_irq()/__enable_irq()或 PRIMASK/BASEPRI 控制全局或分级中断屏蔽
cpp
__disable_irq(); // 全局中断屏蔽(设置 PRIMASK)
__enable_irq(); // 恢复中断
软件触发中断示例:
cpp
NVIC->STIR = EXTI0_IRQn; // 触发 EXTI0 中断
中断服务函数示例
cpp
void USART1_IRQHandler(void) {
if (USART1->SR & USART_SR_RXNE) {
char c = USART1->DR; // 读取接收数据
// 后续处理逻辑
}
}
工程实践建议:
-
中断处理函数尽量短小
-
避免 malloc/new、阻塞或耗时操作
-
优先级分组和抢占策略合理配置
三、启动流程概览
Cortex-M 上电后执行 复位向量 Reset Vector:
| 地址偏移 | 内容 | 说明 |
|---|---|---|
| 0x00 | 初始栈顶 SP | 主栈指针初始化 |
| 0x04 | Reset_Handler | 启动代码入口 |
典型启动流程(STM32 示例):
典型的启动代码由汇编实现,完成如下操作:
- 设置堆栈指针
- 初始化
.bss和.data段 - 调用
SystemInit()完成系统时钟初始化等 - 跳转至
main()函数
Cortex-M 默认使用主堆栈(MSP)作为复位后的初始堆栈。
cpp
Reset_Handler:
LDR R0, =_estack
MOV SP, R0 ; 初始化堆栈
BL SystemInit ; 系统时钟初始化
BL __libc_init_array ; C 库初始化
BL main ; 跳转主函数
四、Thumb 指令集与代码效率
-
Thumb:16-bit 压缩指令,节省 Flash,占用带宽小
-
Thumb-2:混合 16/32-bit 指令,兼顾高密度和复杂操作
示例:16-bit / 32-bit 指令
cpp
// 16 位 Thumb-2 指令
MOVS R0, #1 ; 小指令快速赋值
// 32 位 Thumb-2 指令
BL 0x08001234 ; 远距离函数调用
-
Cortex-M 系列仅支持 Thumb/Thumb-2,不支持传统 ARM 32-bit 指令
-
提升指令预取效率,减小总线占用
五、异常与中断分类
| 异常类型 | 编号 | 描述 |
|---|---|---|
| Reset | -3 | 上电/软件复位 |
| NMI | -2 | 不可屏蔽中断 |
| HardFault | -1 | 所有未处理异常入口 |
| MemManage/BusFault/UsageFault | -12~-10 | 可选系统异常 |
| SVC | -5 | 系统调用,用于 RTOS 特权切换 |
| PendSV | -2 | 延迟中断,用于上下文切换 |
| SysTick | -1 | 系统节拍定时器 |
| 外部中断(EXTI) | 0~n | 对应实际外设(GPIO、USART、DMA 等) |
异常处理流程:
-
自动压栈保存上下文
-
跳转向量表对应地址
-
执行 ISR
-
异常返回(
BX LR,LR 含 EXC_RETURN) -
上下文恢复,返回原任务
异常返回机制(EXC_RETURN)
-
控制使用 MSP/PSP
-
是否启用 FPU
-
Thread Mode / Handler Mode
-
特权/非特权模式切换
cpp
__asm("BX LR");
六、实时性 (Real-Time Responsiveness)
实时性是嵌入式系统的重要特性,决定系统能否在规定时间内对外部事件作出响应。Cortex-M 系列 MCU 由于其低延迟中断和精简指令集,非常适合实时控制场景。
1. 响应时间要求
-
硬实时(Hard Real-Time):必须在严格的时间限制内完成响应,否则可能导致系统失效(如电机控制、飞行控制)。
-
软实时(Soft Real-Time):允许偶尔延迟,但总体延迟应控制在可接受范围内(如数据采集、音频处理)。
2. 任务调度机制
-
抢占式调度:高优先级任务可打断低优先级任务,确保关键任务优先响应。
-
时间片轮转(Round-Robin):相同优先级任务轮流执行,保证系统公平性。
-
优先级管理:
-
静态优先级:任务优先级在设计时确定。
-
动态优先级:根据任务执行情况或等待事件动态调整优先级(如优先级反转解决方案)。
-
3. Cortex-M 支持实时性特性
-
NVIC 提供中断嵌套和抢占控制,可实现低延迟中断响应(< 12 个 CPU 周期)。
-
SysTick 定时器用于周期性调度,适合实现简单 RTOS 或裸机时间片管理。
-
低功耗模式(Sleep/Stop/Standby)可与实时任务唤醒机制结合,兼顾功耗和实时性。
七、RTOS(Real-Time Operating System)
RTOS 是嵌入式系统中实现多任务管理和实时调度的关键软件层。Cortex-M 系列 MCU 与 RTOS 结合,可以大幅提升复杂任务处理能力。
1. RTOS 原理
-
调度管理:RTOS 核心负责根据任务优先级和状态决定下一个执行任务。
-
多线程支持:支持多个并发任务,每个任务拥有独立堆栈和上下文。
-
同步与通信机制:提供信号量、互斥锁、消息队列等资源访问管理手段。
2. 常见 RTOS
| 名称 | 特点 |
|---|---|
| FreeRTOS | 轻量级、可移植、生态成熟,适合 STM32、NXP 等 Cortex-M 平台 |
| Zephyr | 支持更多硬件平台,提供网络栈和设备管理,适合 IoT 设备 |
| RTX (Keil) | CMSIS-RTOS 标准接口,官方支持,易与 ARM Cortex-M 集成 |
3. RTOS 集成 Cortex-M
-
内核接口适配:通过 CMSIS-RTOS API 适配 NVIC 和 SysTick,实现任务切换与定时器功能。
-
系统资源管理:RTOS 管理堆栈、CPU 使用率、中断屏蔽,保障任务隔离和系统稳定。
-
任务调度优化:
-
支持优先级调度与时间片轮转。
-
可配置抢占和非抢占模式,满足不同实时性要求。
-