概念
1 中断
1.1 中断上下文
- 定义: 中断执行时的运行环境,包括寄存器、堆栈和处理器状态(如PSR)。
- ARM Cortex-M:
- 自动保存:R0-R3, R12, LR, PC, xPSR 由硬件压栈(使用主堆栈MSP或进程堆栈PSP)。
- 手动保存:若ISR需要修改其他寄存器(如R4-R11),需软件显式压栈。
- RISC-V:
- 部分自动保存:PC、状态寄存器由硬件保存到mepc和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 - 博客园
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |