异常机制:从异常向量表到 HardFault
2026/9/29大约 2 分钟
Cortex-M 异常机制:从异常向量表到 HardFault
1. 什么是异常?
异常(Exception)可以理解为:
CPU 暂停当前程序,转去执行特定的异常处理函数。
例如:
复位
SysTick
SVC
PendSV
HardFault这些都属于 Cortex-M 的异常。
2. 异常向量表
Cortex-M 通过异常向量表找到对应的处理函数。
典型结构:
向量表
┌──────────────┐
│ 初始 MSP │
├──────────────┤
│ Reset_Handler│
├──────────────┤
│ NMI_Handler │
├──────────────┤
│ HardFault │
├──────────────┤
│ ... │
└──────────────┘CPU 发生异常后,根据异常编号找到对应的向量,从而跳转到 Handler。
所以:
异常发生
↓
异常编号
↓
查异常向量表
↓
找到 Handler
↓
执行异常处理函数3. HardFault 是什么?
HardFault 是 Cortex-M 的一种异常。
典型情况:
错误发生
↓
对应 Fault 无法正常处理
↓
升级到 HardFault例如某些 BusFault、UsageFault 没有启用对应 Handler 时,会进一步进入 HardFault。
因此:
HardFault 本身只是“最后接住错误”的异常入口,不一定是最初的错误原因。
4. 启动文件中的 Weak Handler
启动文件通常会提供默认 Handler:
void HardFault_Handler(void)
{
while (1);
}并通过 weak 机制允许用户重新定义。
如果自己的工程中实现:
void HardFault_Handler(void)
{
// 自己处理
}链接时就会使用自己的实现,而不是启动文件里的默认实现。
5. SVC 也是异常
例如:
SVC #0CPU 会进入:
SVC_Handler()它和 HardFault 一样,都是 Cortex-M 异常机制的一部分。
RTOS 中经常利用:
SVC → 启动任务
PendSV → 任务切换
SysTick → 系统节拍6. 核心链路
把这一篇记成一条线:
异常发生
↓
异常编号
↓
异常向量表
↓
对应 Handler
↓
执行异常处理而 HardFault 调试真正重要的是下一步:
HardFault
↓
硬件自动保存异常现场
↓
解析栈中的 PC / LR / xPSR ...
↓
定位发生错误的位置
