前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第42篇技术报告,由赵思蓉整理,题目为:
“教程:Zephyr消息总线(ZBus)——轻量级和灵活的消息传递系统”
作者简介

自2007年起,Rodrigo一直担任大学教授兼企业家,专注于嵌入式系统项目的研究、开发和咨询工作。作为嵌入式系统部门的协调员,他是阿拉戈斯联邦大学的边缘创新中心的一员。此外,他还是Citrinio公司的创始人之一,该公司是一家设计工作室,也参与咨询和整合项目。他在Zephyr项目中的主要贡献是zbus消息总线系统。
文章简介
本次技术分享的是Zbus——一种轻量级且灵活的消息总线,使线程能够相互通信。在本次分享中,Rodrigo将详细介绍消息总线的新方式,它允许多对多通信和事件驱动的方法。然后,他将强调使用它的挑战和好处,展示示例和应用程序。最后,他提供了一些使用它的实际应用程序。
ZBus简介
Zephyr消息总线(ZBus)是一种为Zephyr设计的轻量级消息传递系统。由Rodrigo Peixoto提出,它旨在提供一种灵活的通信机制,支持异步和解耦的通信方式,提供了时间、空间和同步的解耦。

ZBus允许线程之间进行一对一、一对多和多对多的通信。

ZBus演示
下图展示了使用ZBus通信示例的完整过程,介绍在核心线程、传感器线程和LoRa线程在ZBus上发布读取数据的过程。下面将详细介绍使用ZBus通信的具体步骤。

Step1:需要有主线程与ZBus通道。

Step2:主线程订阅ZBus通道,从ZBus上采集项目信息数据。

Step3:主线程向ZBus通道发送心跳包触发,添加传感器线程,传感器线程从ZBus通道中读取到触发信号,并将传感器数据发布到ZBus通道上给Mock监听者回调。

Step4:核心线程从ZBus通道中读取到传感器数据,并将负载数据发布到ZBus通道上给Mock监听者回调。

Step5:LoRa线程从ZBus通道中读取到有效负载数据,并将数据传输完成信号发布到ZBus通道上给Mock监听者回调。

Step6:添加计时器来定时发送心跳包,移除了主线程发送心跳包的操作。

Step7:将核心线程修改为监听器,可以直接访问并发布数据。

Step8:应用程序订阅通道,读取能工作的数据信息,并且添加锁使数据足够安全。

Step9:修复执行序列。

Step10:添加一条重传消息的通道给核心线程,确保LoRa线程正确读取到有效负载数据并正确发布传输完成信息到ZBus上。

尽量避免过多使用它们,它们在发布过程中运行。
不要在监听器内部使用睡眠操作,这会增加发布延迟。
将其视为中断服务程序(ISR),它们必须尽快执行。
在监听器内部,不要执行耗时操作,而是使用工作队列或单独的线程来执行。
在监听器内部使用zbus_chan_const_msg。通道已经被锁定!
在发布循环时要小心。
避免在总线图上形成循环。
对于链式发布循环要小心处理。

不要在中断服务程序(ISR)中使用ZBus函数。
通过使用工作队列来推迟执行这些操作。
通道可以用作并发属性系统。
使用通道来隔离硬件代码。
将通道用作模块接口(输入/输出)。