051、Zephyr RTOS内核基础:线程通信之消息队列
Zephyr RTOS内核基础:线程通信之消息队列
上周调试一个工业数据采集节点,现场工程师反馈设备偶尔丢包。我盯着逻辑分析仪看了三个小时,发现主控线程和网络线程之间传递传感器数据时,全局变量被意外覆盖了。这种问题在裸机时代靠加锁能糊弄过去,但在RTOS里,你得用正经的线程通信机制——消息队列就是那个“正经”的选项。
消息队列到底解决了什么问题
先别急着看API。你想象一下:两个线程要交换数据,一个生产,一个消费。用全局数组加标志位?中断里改标志位,主循环里查标志位,稍微复杂点的场景就会遇到“读了一半数据被改写”的惨案。信号量只能通知“有数据了”,但数据本身怎么传?消息队列就是那个带缓冲区的管道——生产者往里扔消息,消费者按顺序取,内核帮你管好同步和互斥。
Zephyr的消息队列实现很有意思,它不像FreeRTOS那样把消息拷贝进队列内部缓冲区,而是允许你定义消息大小,内核在队列里维护一个固定大小的消息池。这意味着你不需要动态分配内存,对嵌入式系统来说这是巨大的可靠性提升。
先看一个会翻车的例子
/* 别这样写!这是我在原型阶段踩过的坑 */structsensor_data{ </