1. 中断基础概念:中断向量、中断优先级、中断嵌套、中断延迟的定义与测量方法
中断是嵌入式实时系统的核心机制,它允许CPU暂停当前任务,立即响应外部或内部事件。理解中断的底层概念是进行中断线程化移植与抢占临界区优化的前提。本节将系统梳理中断向量、中断优先级、中断嵌套及中断延迟的定义与测量方法。
1.1 中断向量
中断向量是中断服务程序(ISR)入口地址的索引表。每个中断源对应一个唯一的向量号,CPU在响应中断时,通过硬件自动查找向量表,跳转到对应的ISR执行。
关键点:中断向量表通常位于内存的固定基地址(如ARM Cortex-M的0x00000000),向量表包含栈指针初始值和各异常/中断的入口地址。
| 字段 | 说明 | 典型值 |
|---|---|---|
| 向量号 | 中断源的唯一编号,从0开始 | 0~255 |
| 入口地址 | ISR函数在内存中的起始地址 | 0x08000100 |
| 优先级 | 硬件可编程的中断优先级 | 0~15(4位) |
| 使能位 | 控制中断是否被允许触发 | 0/1 |
1.2 中断优先级
中断优先级决定了当多个中断同时发生时,CPU优先响应哪一个。优先级数值越小,优先级越高(ARM Cortex-M体系)。中断优先级由硬件寄存器控制,支持抢占式调度。
工程实践提示:在RTOS中,中断优先级通常被划分为两个区域:高优先级区域(直接中断,不受OS管理)和低优先级区域(可被OS接管,用于中断线程化)。划分阈值由OS配置决定。
1.3 中断嵌套
中断嵌套指一个中断服务程序正在执行时,被另一个更高优先级的中断所打断,CPU暂停当前ISR,转而执行更高优先级的ISR,处理完毕后再恢复原ISR的执行。
注意:过深的中断嵌套会导致栈溢出和延迟抖动。在实时系统中,通常限制嵌套深度不超过3层,或使用中断线程化将大部分中断处理转移到线程上下文。
1.4 中断延迟
中断延迟(Interrupt Latency)是从硬件中断信号产生到CPU开始执行第一条ISR指令之间的时间间隔。它是衡量实时系统响应能力的关键指标。
中断延迟的组成
| 阶段 | 描述 | 典型时间(CPU周期) |
|---|---|---|
| 硬件响应时间 | CPU完成当前指令、识别中断、压栈PC/PSR等 | 12~20 cycles |
| 中断向量查找 | 从向量表读取ISR入口地址 | 2~4 cycles |
| 上下文保存 | 保存被中断任务的寄存器现场 | 10~30 cycles |
| OS调度延迟(可选) | RTOS进行中断接管、调度决策 | 20~100 cycles |
| ISR入口跳转 | 跳转到ISR函数体 | 2~4 cycles |
中断延迟的测量方法
- 硬件逻辑分析仪法:将中断请求引脚和CPU的ISR执行指示引脚(如GPIO翻转)接入逻辑分析仪,测量两个信号边沿之间的时间差。
- 定时器捕获法:使用定时器捕获中断触发时刻,在ISR入口处读取定时器值,计算差值。
- RTOS内置测量:许多RTOS(如FreeRTOS、RT-Thread)提供中断延迟测量钩子函数,自动记录最大/最小延迟。
测量代码示例(定时器捕获法):
/* 中断延迟测量示例 - 基于硬件定时器 */
static uint32_t irq_latency_max = 0;
static uint32_t irq_latency_min = 0xFFFFFFFF;
void EXTI0_IRQHandler(void)
{
uint32_t enter_time = TIM2->CNT; /* 读取当前定时器计数值 */
uint32_t latency;
/* 计算延迟:假设中断触发时定时器值被硬件锁存到寄存器 */
latency = enter_time - trigger_timestamp;
/* 更新最大/最小延迟 */
if (latency > irq_latency_max) {
irq_latency_max = latency;
}
if (latency < irq_latency_min) {
irq_latency_min = latency;
}
/* 实际中断处理逻辑 */
/* ... */
/* 清除中断标志 */
EXTI->PR = (1 << 0);
}
1.5 概念对比与工程意义
| 概念 | 定义 | 工程影响 | 优化方向 |
|---|---|---|---|
| 中断向量 | ISR入口地址索引表 | 向量表错误导致系统崩溃 | 向量表重定向、RAM中动态更新 |
| 中断优先级 | 中断响应顺序的硬件等级 | 优先级设置不当导致死锁 | 合理划分OS接管阈值 |
| 中断嵌套 | 高优先级ISR抢占低优先级ISR | 嵌套过深导致栈溢出、延迟抖动 | 限制嵌套深度、使用中断线程化 |
| 中断延迟 | 从触发到ISR执行的时间 | 直接影响系统实时性 | 减少临界区长度、优化上下文切换 |