zbus 是 Zephyr 里的软件总线:一个通道(channel)持有"最后一条消息",若干个观察者(observer)订阅它。发布方只管往通道里放,谁关心谁自己取,双方不用互相 include。
四类观察者
- listener:在发布者上下文同步回调,必须极短,当 ISR 写。
- async listener:丢到 workqueue 里跑。
- subscriber:自己的线程 + msgq,只收到"通道变了"的通知。
- message subscriber:线程 + FIFO,收到消息副本(依赖 net_buf 池)。
关键约束
通道和观察者是链接段里的全局符号,宏必须写在文件作用域;发布时锁住通道、memcpy 消息、按顺序回调,所以 listener 里不能阻塞。subscriber 只通知不排队,连发两次只会读到最新值——需要不丢消息就用 message subscriber 或 FIFO。
什么时候别用
高速字节流(用 k_pipe / k_msgq)、需要请求-响应配对的场景(用消息队列或协议层自己做 seq)。它适合的是"状态广播"和"事件解耦"。
本文由 GitHub Actions/服务器自动构建发布。
- 本文链接: https://graveblog.cn/p/zbus/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
