061、Zephyr RTOS内核基础:中断与线程交互

📅 2026/6/26 4:03:07
061、Zephyr RTOS内核基础:中断与线程交互
Zephyr RTOS 内核基础:中断与线程交互一个让我熬夜到凌晨三点的bug去年做一款工业数据采集器,MCU是STM32H743,Zephyr 2.7.1。设备在实验室跑了一周都好好的,上了产线第一天就随机死机。现象诡异:UART接收中断偶尔触发,但对应的线程就是收不到数据,系统像被什么东西卡住了一样。我接上JLink,打开SystemView,发现中断服务函数执行时间异常——一个本该在5微秒内完成的SPI读取操作,竟然跑了200多微秒。更诡异的是,中断里调用的k_sem_give居然阻塞了。那一刻我意识到:我对Zephyr中断与线程交互的理解,还停留在“中断里不能调用阻塞API”这种教科书层面。真正的问题远比这复杂。中断上下文 vs 线程上下文:不是你想的那样Zephyr里中断和线程的界限,比Linux要模糊得多。原因在于Zephyr支持两种中断处理模式:直接中断(Direct Interrupt):最轻量,不经过内核调度器,不能调用任何内核API。适合极其简单的处理——比如清中断标志、写一个寄存器。常规中断(Regular Interrupt):经过内核的ISR包装,可以调用部分内核API(k_sem_give、k_msgq_put等),但依然不能调用会阻塞或触发调度的API(比如k_sem_take、