概念
1 中断
1.1 中断上下文
-
定义: 中断执行时的运行环境,包括寄存器、堆栈和处理器状态(如PSR)。
-
ARM Cortex-M:
-
自动保存:R0-R3, R12, LR, PC, xPSR 由硬件压栈(使用主堆栈MSP或进程堆栈PSP)。
-
手动保存:若ISR需要修改其他寄存器(如R4-R11),需软件显式压栈。
-
-
RISC-V:
-
部分自动保存:PC、状态寄存器由硬件保存到
/* by 01022.hk - online tools website : 01022.hk/zh/tiffcompression.html */ mepc
和/* by 01022.hk - online tools website : 01022.hk/zh/tiffcompression.html */ mstatus
。 -
手动保存:多数寄存器需软件通过
CSR
指令处理。
-
-
1.2 中断响应延迟
-
定义: 从 中断信号触发 到 执行第一条中断服务程序指令 的时间间隔
-
影响因素:
-
硬件流水线状态: 当前执行指令是否完成(如多周期指令)。
-
上下文保存: CPU需要保存当前任务状态(如寄存器压栈)。
-
内核跳转: 内核跳转到ISR的花销
-
优先级判断: 若更高优先级中断正在处理,需等待其完成。
-
-
arm cortex-m内核中断延迟时间
1.3 中断嵌套
-
定义: 高优先级中断抢占低优先级中断, 形成嵌套执行
-
Cortex-M:
- 硬件自动支持嵌套:若新中断优先级更高,自动触发抢占。
-
RISC-V:
- 默认不支持嵌套:需在ISR中手动重新开启全局中断(mstatus.MIE), 需要手动保存和恢复上下文, 可能导致栈溢出风险。
1.4 中断咬尾
- 定义: 当退出中断服务程序时, 若存在其他中断挂起(pending), CPU直接切换到下一个中断服务中执行, 跳过恢复上下文和保存上下文, 减少中断带来的资源消耗
1.5 中断晚到
在arm cortex-m3内核中的NVIC中断控制器支持中断晚到功能
-
概念: 当Cortex-M3对某异常的响应序列还处在早期:入栈的阶段,尚未执行其他服务程序时。如果此时收到了更高优先级异常的请求,则本次入栈就成了高优先级中断做的了。入栈后,将执行高优先级的异常服务程序。可见,高优先级的异常虽然来晚了,却因为优先级高使得服务程序可以被先处理,低优先级异常的入栈操作则变成了为高优先级异常的入栈。
-
举个例子: 比如,若在响应某低优先级异常1的早起,检测到了高优先级异常2,则只要2没有太晚,就能以“晚到中断”的方式处理,在入栈完毕后执行ISR,如果异常2来得太晚,以至于已经执行了ISR1的指令,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节的堆栈空间。在ISR2执行完毕后,则以“咬尾中断”的方式来启动ISR1的执行。
-
总结:
-
当低优先级的中断早期, 若收到高优先级中断的请求, 则会响应高优先级中断, 高优先级中断结束后, 低优先级中断通过中断咬尾得以继续执行, 得益于中断咬尾, 整个过程只需要一次中断上下文的保存与恢复
-
当低优先级已经ISR阶段, 若收到高优先级中断的请求, 则会响应高优先级中断, 会硬件自动将低优先级的中断现场保存到栈中, 高优先级中断结束后, 再恢复低优先级中断现场, 整个过程需要两次中断上下文的保存与恢复
-
1.6 中断向量表
定义: 存储中断处理程序的入口地址
1.7 矢量中断与非矢量中断(RISC-V)
-
定义:
-
矢量中断: 每个中断源有独立入口,硬件自动跳转。矢量中断减少了软件开销,响应更快。
-
非矢量中断: 统一入口,软件查询中断源。非矢量中断需要额外的判断步骤,但更灵活。
-
1.8 不可屏蔽中断与可屏蔽中断
特性 | 不可屏蔽中断(NMI) | 可屏蔽中断(Maskable Interrupt) |
---|---|---|
触发条件 | 硬件级紧急事件(如电源故障、硬件错误) | 普通外设事件(如定时器、GPIO中断) |
中断屏蔽 | 无法通过全局中断开关禁用(优先级最高) | 可通过全局中断开关(如 PRIMASK)临时关闭 |
优先级 | 固定最高优先级(硬件定义) | 可配置优先级(由NVIC或PLIC管理) |
应用场景 | 系统级容错(看门狗复位、内存校验错误) | 普通外设交互(UART收发、按键输入) |
处理策略 | 需极简设计(避免嵌套或阻塞) | 允许嵌套、支持复杂逻辑(如调用函数) |
2 异常
同步异常与异步异常
-
同步异常,其原因可以精确定位到某一条执行指令
-
异步异常,每次发生时指令的PC可能不一样,例如中断便时一种异步异常
特性 | 同步异常(Synchronous Exception) | 异步异常(Asynchronous Exception) |
---|---|---|
触发时机 | 指令执行时立即触发,与流水线紧密相关 | 外部事件触发,与指令执行无关 |
确定性 | 可精确复现(如非法指令必然触发异常) | 随机性(如中断信号可能在任意时刻到来) |
处理延迟 | 必须立即处理(否则程序无法继续执行) | 可延迟处理(取决于中断优先级和屏蔽状态) |
典型场景 | HardFault、除零、断点指令 | 外部中断(GPIO)、定时器中断、DMA完成 |
架构实现 | 由CPU核心直接检测 | 依赖中断控制器(如NVIC、PLIC)分发 |
-
异步异常又分为精确异步异常和非精确异步异常
-
精确异步异常,在响应异常后的处理器状态能够精确反映为某一条指令的边界
-
非精确异步异常,在响应异常后的处理器状态无法精确反映为某一条指令的边界
-
例如: 中断就是精确异步异常, 读写存储器出错是非精确异步异常
RISC-V中异常是不可屏蔽的,并且异常处理时, 硬件会自动关闭全局中断
特性 | 精确异步异常 | 非精确异步异常 |
---|---|---|
定义 | 异常触发时,处理器能准确定位事件发生点 | 无法精确定位触发点,处理器上下文可能存在执行偏差 |
可恢复性 | 可精准恢复至触发前状态 | 通常不可恢复或需放弃部分上下文 |
典型场景 | 调试断点、精确计时器中断 | 总线错误、多核竞争访问 |
RISC-V实现 | 通过mepc准确记录PC,硬件保证状态一致性 | 需自定义处理(如扩展异常日志寄存器) |
非矢量中断和矢量中断
同步异常与异步异常: 异步异常又分为精确异步异常和非精确异步异常
-
同步异常,其原因可以精确定位到某一条执行指令
-
异步异常,每次发生时指令的PC可能不一样,例如中断便时一种异步异常
-
精确异步异常,在响应异常后的处理器状态能够精确反映为某一条指令的边界
-
非精确异步异常,在响应异常后的处理器状态无法精确反映为某一条指令的边界
例如: 中断就是精确异步异常, 读写存储器出错是非精确异步异常
3 中断与异常的异同点
3.1 中断与异常类型
arm: 中断是异常的特例——一种异步异常
risc-v: 中断和异常严格区分
不可屏蔽中断和可屏蔽中断
非矢量中断和矢量中断
同步异常与异步异常: 异步异常又分为精确异步异常和非精确异步异常
参考文档
实战技能分享,减小开关中断对系统实时性的影响,提升系统响应速度 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
Cortex-M3 咬尾中断 与 晚到中断 - uTank - 博客园