banner
Object Recognition and ZBUS-Based ADC Data Publishing in Zephyr RTOS

Настоящая работа является развитием решения, представленного в статье “Object Recognition and ADC using TIMER/PPI in Zephyr RTOS”. Весь функционал, реализованный в предыдущей публикации, полностью сохранен. Для более глубокого понимания контекста читателю рекомендуется ознакомиться с базовой статьей.
Данные, генерируемые датчиками или АЦП в одних потоках, часто требуется передавать в другие потоки приложения. Эффективным инструментом для межпоточного взаимодействия в Zephyr RTOS является подсистема zbus, которая реализует классический паттерн «публикация/подписка» (publish/subscribe). В данной работе описан процесс публикации данных АЦП в канале zbus с последующим их получением потоками-подписчиками A и B. Программный модуль разработан в составе клиента CoAP. Результаты его работы представлены на рисунке 1.
На рисунке 2 приведен исходный код публикации данных АЦП. Программа считывает аналоговое напряжение с двух каналов (channel_0 и channel_1), после чего вычисляет для каждого из них минимальное (MIN), максимальное (MAX) и среднее (AVG) значения. Полученные параметры записываются в структуру publish_data_adc. Отправка структуры в канал zbus_name реализуется вызовом функции zbus_chan_pub(). В случае успешного завершения операции макросы LOG_INF() выводят значения АЦП в терминал VS Code».
Исходный код получения данных АЦП из канала zbus показан на рисунке 3. Канал zbus определяется в строках 97–104 листинга, а его подписчиками служат элементы adc_sub_a и adc_sub_b (строки 106 и 107). В строках 154–157 определяются два потока (А и В), использующие функции subscriber_a_thread и subscriber_b_thread, реализации которых приведены в строках 109–130 и 132–152 соответственно. Объекты подписчиков необходимы внутри этих функций для управления поведением потоков. Поскольку алгоритм работы функций идентичен, подробно рассмотрим логику функции subscriber_a_thread.
Алгоритм работы потока A:
  • Ожидание: в строке 118 поток вызывает zbus_sub_wait() и переходит в режим ожидания до получения уведомления от подписчика adc_sub_a;
  • Проверка: после получения уведомления в строке 121 проверяется имя активного канала zbus;
  • Чтение: в строке 122 функция zbus_chan_read() копирует данные из канала в структуру received_data_adc_a;
  • Вывод: макросами LOG_INF() данные структуры выводятся в терминал Visual Studio Code.
Это тридцать седьмая статья из цикла "Real-Time Object Recognition". Первые тридцать шесть опубликованы здесь: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 и 36.

1. Результат работы программы

Рисунок 1


2. Публикация данных АЦП в канал ZBUS

Рисунок 2


3. Получение данных АЦП потоками-подписчиками ZBUS

Рисунок 3

Проект скомпилирован с помощью nRF Connect SDK v3.2.4 и загружен на плату nRF7002-DK в операционной системе macOS Tahoe 26.3.

Проект можно загрузить coap_client_adc_zbus.zip .
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
Евгений Вересов.
10.01.2027 года.