核心特性
- ✓基于硬件优先级的中断嵌套
- ✓高优先级中断可抢占低优先级 ISR
- ✓自动上下文保存与恢复
- ✓实时性上限保障机制
基于 HRTOS 中断驱动模型,展示高优先级中断如何抢占低优先级 ISR 执行, 实现实时系统中关键事件的快速响应机制。
嵌套中断机制适用于需要同时处理多个中断源的实时系统, 确保高优先级事件(如紧急故障、安全关键信号)能够立即响应, 不受低优先级中断处理时间的影响。
嵌套中断的核心概念与工作原理
嵌套中断(Nested Interrupt)是指在中断服务程序(ISR)执行过程中, 如果出现更高优先级的中断请求,CPU 可以暂停当前 ISR 的执行, 转而响应高优先级中断,待高优先级中断处理完成后,再恢复原 ISR 的执行。
嵌套中断基于硬件中断优先级机制。每个中断源都有独立的优先级配置, 高优先级中断可以自动抢占低优先级中断的执行。
当发生中断嵌套时,CPU 硬件会自动保存当前执行上下文(程序计数器、状态寄存器等), 确保中断返回后能够准确恢复执行现场。
多个 ISR 可以形成嵌套调用链,高优先级 ISR 执行完成后, 通过中断返回指令依次恢复低优先级 ISR 的执行。
嵌套中断机制确保关键事件能够立即响应,不受低优先级中断处理时间的影响, 是实时系统满足严格时间约束的重要保障。
嵌套中断的完整执行路径
HRTOS v2 中断管理相关接口
函数:os_interrupt_init()
功能:初始化 HRTOS 中断管理系统
参数:无
返回值:初始化状态
函数:os_schedule_request()
功能:请求中断后的任务调度
参数:无
返回值:无
嵌套中断的完整实现示例
高优先级 INT0_ISR 和低优先级 INT1_ISR 的实现
#include "hrtos.h"
sbit LED_HIGH = P1^0;
sbit LED_LOW = P1^1;
/* =========================
* 高优先级中断 INT0
* ========================= */
void INT0_ISR(void)
{
LED_HIGH = ~LED_HIGH;
// 高优先级执行
}
/* =========================
* 低优先级中断 INT1
* ========================= */
void INT1_ISR(void)
{
LED_LOW = ~LED_LOW;
// 在执行过程中可能被INT0抢占
}
hrtos_main 函数,配置中断优先级并启用中断
/* =========================
* 系统入口
* ========================= */
void hrtos_main(void)
{
IT0 = 1; // INT0 下降沿触发
IT1 = 1; // INT1 下降沿触发
PX0 = 1; // INT0 高优先级
PX1 = 0; // INT1 低优先级
EX0 = 1; // 启用 INT0
EX1 = 1; // 启用 INT1
}
嵌套中断在实时系统中的重要作用
使用嵌套中断时需要关注的关键点
必须正确配置中断优先级寄存器(如 PX0、PX1),确保高优先级中断能够正确抢占低优先级中断。 优先级配置错误可能导致关键事件无法及时响应。
嵌套中断会增加栈空间的使用,每层嵌套都需要保存完整的上下文信息。 必须确保系统栈空间足够,避免因栈溢出导致的系统崩溃。
低优先级 ISR 的执行时间应尽可能短,避免长时间占用 CPU 资源。 过长的 ISR 会增加高优先级中断的响应延迟,影响系统实时性。
在嵌套中断环境中访问共享资源(如全局变量、硬件寄存器)时, 需要使用适当的同步机制(如关中断、信号量)防止数据竞争。
深入学习的相关资源