一、中断处理:嵌入式系统的"心跳"机制
在嵌入式系统中,中断是硬件或软件触发的事件,会立即打断当前程序执行,转而执行特定的中断服务程序(ISR)。其核心作用是实现实时响应,例如按键按下、传感器数据到达、定时器超时等场景。
重要性:
- 实时性:确保关键任务(如电机控制、通信协议)在严格时限内完成。
- 资源高效:通过中断触发而非轮询,降低CPU空耗。
- 系统稳定性:合理设计中断可避免死锁、优先级反转等问题。
二、中断的分类与区别
1. 硬件中断 vs 软件中断
特性 |
硬件中断 |
软件中断 |
触发方式 |
由外部硬件设备(如按键、定时器)触发 |
由程序指令(如系统调用)主动触发 |
响应速度 |
立即响应(优先级高) |
需经过系统调度(优先级可控) |
典型应用 |
外部事件响应(如UART数据到达) |
系统服务调用(如文件读写) |
三、中断处理流程解析
以STM32为例,中断处理步骤如下:
- 中断触发:外部事件(如定时器溢出)发送中断请求(IRQ)。
- 中断使能:在NVIC(嵌套向量中断控制器)中开启对应中断通道。
- 中断响应:CPU保存当前上下文(寄存器状态、程序计数器),跳转至中断向量表。
- 执行ISR:调用预定义的中断服务程序(如
TIM2_IRQHandler
)。
- 中断恢复:ISR执行完毕后,恢复上下文并返回主程序。
关键点:
- 中断嵌套:高优先级中断可打断低优先级ISR。
- 中断延迟:需通过优化代码(减少ISR执行时间)和合理分配优先级降低延迟。
四、面试高频问题与解答
Q1:如何避免中断死锁?
A:
- 遵循"中断中只做必要操作"原则(如标记标志位,不执行耗时操作)。
- 使用信号量或消息队列实现中断与任务间的同步。
Q2:中断优先级如何设置?
A:
- 关键外设(如ADC采样)设为高优先级。
- 系统级任务(如看门狗复位)优先级高于应用层。
Q3:为什么需要中断向量表?
A:中断向量表存储了各中断对应的处理函数地址,确保CPU能快速定位并调用ISR。
五、实战案例:STM32定时器中断配置
// 初始化定时器TIM2,1秒中断
void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef timInitStruct;
NVIC_InitTypeDef nvicInitStruct;
// 时钟配置(72MHz系统时钟)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 定时器参数:1秒(ARR=72000)
timInitStruct.TIM_Prescaler = 71999;
timInitStruct.TIM_Period = 9999;
TIM_TimeBaseInit(TIM2, &timInitStruct);
// 中断配置
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能定时器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
明日预告:RTOS任务调度原理与实现(含优先级反转解决方案)