058、Zephyr RTOS内核基础:中断管理基础
Zephyr RTOS 内核基础:中断管理基础
从一次现场崩溃说起
去年冬天在江苏某工厂调试一款基于Zephyr的工业网关,设备运行三天后突然死机。串口日志停在某个GPIO中断服务函数里,看门狗超时复位。用调试器挂上去,发现中断服务函数里调用了k_sem_give,而那个信号量恰好被一个高优先级线程占用——死锁了。更麻烦的是,这个中断是边缘触发的,第二次中断已经丢失。
那次之后我花了整整一周重写中断处理逻辑,也彻底搞懂了Zephyr的中断管理机制。今天这篇笔记,就从那次教训说起。
中断向量表:别被ARM的“骚操作”坑了
Zephyr在ARM Cortex-M系列上默认使用向量表重定位。很多新手直接写IRQ_CONNECT宏就以为万事大吉,结果发现中断不触发——八成是向量表没对齐。
// 正确的做法:确保向量表在SRAM中按256字节对齐// 别这样写:直接声明一个数组__attribute__((aligne