Использование RTT логирования вместо Serial.print

Материал носит ознакомительный характер. Работа с электроникой и микроконтроллерами требует соблюдения техники безопасности; автор не несет ответственности за возможные повреждения оборудования или иной ущерб, возникший в ходе обучения.

В мире Arduino отладка — это всегда Serial.print(). Мы привыкли выделять под это два пина (TX/RX), занимать USB-порт и мириться с тем, что вывод текста тормозит программу. В nRF52840 и Zephyr RTOS мы переходим на профессиональный стандарт, который работает быстрее и не требует лишних проводов.

Почему Serial.print — это тупик?

Обычный UART — медленный протокол. Если выводить длинные логи во время работы Bluetooth, процессор может «зависнуть» на обслуживании порта. Для BLE это критично: малейшая задержка — и соединение разорвано.

К тому же, в современной разработке использовать UART для отладки — расточительство. Он занимает аппаратные ресурсы и потребляет лишнюю энергию, сокращая жизнь батарейки.

Технология SEGGER RTT

На вашей плате nRF52840 DK есть чип-программатор J-Link. Он общается с основным микроконтроллером через интерфейс SWD. Технология SEGGER Real Time Transfer (RTT) позволяет передавать данные прямо через этот отладочный канал.

Как это работает:

  1. В оперативной памяти (RAM) создается кольцевой буфер.
  2. Процессор записывает туда логи за наносекунды.
  3. Программатор J-Link считывает буфер «на лету», не отвлекая основной чип от задач.

Главный плюс: RTT позволяет видеть логи даже внутри прерываний, где обычный Serial мгновенно «уронил» бы систему.

Настройка Logger и Backend

В Zephyr RTOS за вывод сообщений отвечает Logger. Он отделяет текст сообщения от способа его доставки. Куда именно уйдет лог (в UART, файл или RTT), решает Backend (обработчик вывода).

Вам не нужно инициализировать порты в коде. Просто укажите настройки в файле prj.conf:

# Включаем модуль логирования
CONFIG_LOG=y

# Активируем технологию SEGGER RTT
CONFIG_USE_SEGGER_RTT=y

# Назначаем RTT основным бэкендом для вывода логов
CONFIG_LOG_BACKEND_RTT=y

Важно: RTT работает, пока подключен отладчик. Если запустить устройство автономно, данные будут просто писаться в буфер RAM, не мешая программе.

Практика: Уровни важности

Забудьте про Serial.println("Error!"). Используйте макросы — они позволяют раскрашивать логи и фильтровать их по критичности.

Уровень (Severity)МакросЦветКогда использовать
ErrorLOG_ERR()КрасныйКритическая ошибка, работа нарушена
WarningLOG_WRN()ЖелтыйПодозрительное поведение
InfoLOG_INF()БелыйВажные этапы (например, "Connected")
DebugLOG_DBG()СерыйПодробности для поиска багов

Пример кода

Зарегистрируйте модуль в начале .c файла и используйте макросы вместо «принтов»:

#include <zephyr/logging/log.h>
// Регистрируем модуль: имя и уровень фильтрации
LOG_MODULE_REGISTER(my_project, LOG_LEVEL_INF);

void main(void) {
    int sensor_value = 42;
    
    LOG_INF("System started");
    LOG_DBG("Raw value: %d", sensor_value);
    
    if (sensor_value > 100) {
        LOG_ERR("Value out of range!");
    }
}

Как смотреть логи в VS Code?

Вам не нужны сторонние терминалы. Все встроено в расширение nRF Connect:

  1. Подключите плату.
  2. В нижней панели откройте вкладку nRF Connect Serial Terminal.
  3. Нажмите «+» и выберите RTT.

Вы получите чистое цветное окно, которое не занимает COM-порт вашего компьютера. 🚀

Итог: зачем это вам?

RTT — это не только удобство, но и энергоэффективность. UART потребляет ток, даже когда молчит. Переход на RTT — ваш первый шаг к устройствам, которые работают годами от одной «таблетки» CR2032.

В следующем уроке мы научимся использовать эти инструменты, чтобы отправить nRF52840 в глубокий сон, сохраняя полный контроль над отладкой.