044、Zephyr RTOS内核基础:线程状态与切换

发布时间:2026/6/16 17:20:01
044、Zephyr RTOS内核基础:线程状态与切换 Zephyr RTOS内核基础:线程状态与切换从一次诡异的死锁说起去年做的一个工业数据采集项目,现场设备跑着跑着就“死”了——看门狗没触发,CPU还在跑,但所有任务都不响应了。用JLink连上去,发现三个线程全卡在k_sem_take()上,信号量计数显示为0,但明明代码逻辑里应该有任务释放信号量。折腾了两天,最后发现是某个线程在临界区里调了k_yield(),导致调度器在持有锁的情况下切走了线程,其他任务永远等不到锁释放。这个坑让我意识到:理解Zephyr的线程状态机,比背API参数重要一百倍。今天这篇笔记,就从调度器最底层的状态切换讲起。线程的五种“活法”Zephyr的线程状态不像Linux那么复杂,但每个状态背后的切换逻辑都藏着性能陷阱。打开kernel/include/kernel_structs.h,你会看到_thread_base结构体里的thread_state字段,它用位掩码表示状态:/* 别被这些宏吓到,实际就5种有效组合 */#