知用网
白蓝主题五 · 清爽阅读
首页  > 电脑维护

嵌入式系统中断处理:让设备更灵敏的幕后功臣

家里的智能门铃一响,手机马上收到通知。这个看似简单的过程,背后其实是嵌入式系统在默默工作。尤其是中断处理机制,它决定了设备能不能及时响应外部事件。

什么是中断?

想象你在厨房煮面,水开了会冒蒸汽发出哨声。这个声音打断你正在看的电视节目,你立刻去关火。这里的“哨声”就是中断信号,而你暂停看电视、去处理烧水这件事,就是中断处理的过程。

嵌入式系统里,中断是硬件或软件发出的一种电信号,用来告诉处理器:“现在有紧急事要处理!”比如按键按下、定时器超时、串口收到数据,都会触发中断。

中断服务程序怎么写?

每个中断都对应一段专门的代码,叫中断服务程序(ISR)。这段代码必须快进快出,不能拖泥带水。下面是一个典型的ARM Cortex-M系列单片机中的中断处理示例:

void USART2_IRQHandler(void) {
    if (USART2->SR & USART_FLAG_RXNE) {  // 判断是否接收到数据
        uint8_t ch = USART2->DR;         // 读取接收到的字节
        ring_buffer_put(&rx_buf, ch);    // 存入缓冲区
    }
}

这段代码运行在中断上下文中,不能调用延时函数、动态内存分配或者打印调试信息。否则会影响其他中断的响应,甚至导致系统卡死。

优先级设置很关键

多个中断同时来怎么办?就像你煮面时门铃也响了,先关火还是先开门?这就靠中断优先级来决定。

大多数嵌入式芯片支持可配置的中断优先级。比如安全相关的中断(如过温保护)应该设为高优先级,而LED闪烁这种非紧急任务可以放低。

NVIC_SetPriority(EXTI0_IRQn, 1);   // 设置外部中断0为较高优先级
NVIC_SetPriority(TIM3_IRQn, 3);     // 定时器3设为较低优先级

别让中断成负担

有人喜欢在中断里做太多事,比如直接解析协议、控制电机转向。这会让主程序跑得越来越慢。正确的做法是:中断只做最必要的事——比如把数据存起来,然后通过标志位通知主循环去处理。

好比快递员按门铃(中断),你签收(记录包裹),但不会当场拆箱验货。那是之后的事。

常见问题排查

有时候写了中断却没反应,可能是使能没开全。除了开启外设中断,还得打开 NVIC 中断通道:

USART2->CR1 |= USART_CR1_RXNEIE;      // 使能接收中断
NVIC_EnableIRQ(USART2_IRQn);          // 使能中断向量

还有一种情况是中断反复触发,可能是因为清标志不及时。务必在 ISR 结尾正确清除中断源,否则会陷入“死循环中断”。

嵌入式系统的稳定性,往往藏在这些细节里。一个设计良好的中断机制,能让设备既灵敏又可靠。