|
CoAP Protocol and Message Queues in Zephyr RTOS.
В этой статье речь пойдет об очередях сообщений (Message Queues) и обработчиках прерываний в Zephyr RTOS в
контексте расширения, описанного в предыдущей статье.
Коротко напомню содержание предыдущей статьи.
Программа Object Detector распознает объекты, передает их имена посредством протокола CoAP (через сервер CoAP) в Zephyr RTOS.
Клиент CoAP в Zephyr RTOS принимает имена объектов, а расширение CoAP управляет рабочими потоками в
соответстветствии с именами принятых объектов.
Описанное в предыдущей статье расширение протокола CoAP не передает в потоки никаких данных (команд),
а от оборудования не поступает сигналов обратной связи, например, в виде прерываний.
Решим эти две задачи.
Добавим в код нашего расширения CoAP две очереди сообщений (Message Queues) и два обработчика прерываний (ISR).
Каждый поток будет отправлять изменяющие данные в свою очердь сообщений, а каждый обработчик прерываний будет извлекать данные из
очереди сообщений. Отправляемые в очередь и извлекаемые из очереди данные будут выводиться в монитор для контроля работы приложения.
На рисунке 1 показан исходной код расширения.
На рисунке 2 показан результат работы программы CoAP с расширением запущенной на плате nRF7002 DK.
На рисунке 3 показана программа CoAP с расширением в режиме nRF Debug.
Отмечу, что реализация протокола CoAP принадлежит вот этому автору.
Опубликованный им исходный код не изменен.
Для запуска расширения к основному тексту добавлен
вызов функции static void decoding_object (const uint8_t *payload).
Место вызова функции показано на рисунке 4 в строке 273.
1. Исходный код и результат работы программы.
Рисунок 1.
Рисунок 2.
Рисунок 3.
Рисунок 4. 2. Описание расширения для протокола CoAP.
Код расширения предствавлен на рис. 1.
Обратите внимание, в данной реализации расширения запуск таймеров k_timer_start() выполняется внутри потоков.
Это упрощает наблюдение за отправляемыми в очередь и получаемыми из очереди данными.
В реальных устройствах прерывания формируются, как првило, в произвольное время.
Для приближения расширения к работе с реальными устройствами код можно изменить,
достаточно функции k_timer_start() вынести за пределы функций потоков и определить периоды срабатывания таймеров.
Расширение можно загрузить.
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
|
