Zephyr RTOS内核基础:线程同步之信号量
上周调试一个工业数据采集节点,遇到个诡异现象:两个传感器线程同时往共享缓冲区写数据,偶尔会出现数据错乱——A线程刚写完头部,B线程就把尾部覆盖了。翻看log发现,问题出在临界区保护上。当时用的是全局变量做标志位,结果在ARM Cortex-M4上被中断撕开了口子。后来换成Zephyr的信号量,问题瞬间消失。今天就把信号量这块硬骨头啃透。
信号量本质:一把带计数的钥匙
信号量在Zephyr里不是简单的锁,它维护着一个内部计数器。k_sem_give增加计数,k_sem_take减少计数。当计数为0时,take操作会让线程挂起等待——这个机制天然适合解决“生产者-消费者”模型。
看个典型场景:UART中断服务程序收到一帧数据,需要通知主循环处理。用信号量实现:
K_SEM_DEFINE(uart_sem, 0, 1)<


