Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Real-Time Transfer (RTT)

Во время разработки встраиваемых систем нужен способ видеть, что происходит внутри программы. На обычном компьютере для вывода сообщений в терминал используют println!, но у микроконтроллера нет ни экрана, ни подключённого терминала. Real-Time Transfer (RTT) решает эту проблему: он позволяет выводить отладочные сообщения и логи с микроконтроллера на ваш компьютер.

Что такое RTT?

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

Когда вы подключаете отладочный зонд Raspberry Pi к Pico, создаётся соединение, которое умеет делать две вещи:

  • Прошивать новые программы в чип
  • Читать и записывать память чипа

RTT использует эту возможность доступа к памяти. Он создаёт специальные буферы памяти на микроконтроллере, а отладочный зонд считывает эти буферы и выводит сообщения на ваш компьютер. Всё это происходит в фоне, пока программа работает в обычном режиме.

Логирование с помощью defmt

Defmt (сокращение от «deferred formatting», то есть «отложенное форматирование») — фреймворк логирования, созданный специально для устройств с ограниченными ресурсами, таких как микроконтроллеры. В embedded-проектах на Rust вы будете использовать defmt для вывода сообщений и отладки программ.

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

Ваш Pico отправляет небольшие коды вместо полных текстовых сообщений. Компьютер получает эти коды и превращает их в обычный текст. Это позволяет держать прошивку компактной и не тратить время микроконтроллера на медленное форматирование строк.

Крейт defmt можно добавить в проект:

defmt = "1.0.1"

И использовать его так:

#![allow(unused)]
fn main() {
use defmt::{info, warn, error};

...
info!("Starting program");
warn!("You shall not pass!");
error!("Something went wrong!");
}

Defmt RTT

Сам по себе defmt не знает, как отправлять сообщения с Pico на компьютер. Ему нужен транспортный уровень. Здесь на помощь приходит defmt-rtt.

Крейт defmt-rtt связывает defmt с RTT, поэтому ваши сообщения логов передаются на компьютер через отладочный зонд.

Крейт defmt-rtt можно добавить в проект:

defmt-rtt = "1.0"

Tip

Чтобы видеть логи RTT и defmt, нужно запускать программу с помощью инструментов probe-rs, например командой cargo embed. Эти инструменты автоматически открывают сессию RTT и показывают логи в терминале.

Затем подключите его в коде:

#![allow(unused)]
fn main() {
use defmt_rtt as _;
}

Эта строка настраивает соединение между defmt и RTT. Вы не вызываете из неё функции напрямую, но её нужно импортировать, чтобы всё работало.

Сообщения о панике с panic-probe

Когда программа аварийно завершается (паникует), нужно понимать, что пошло не так. Крейт panic-probe выводит сообщения о панике через defmt и RTT.

Крейт panic-probe можно добавить в проект:

# Функция print-defmt — указывает panic-probe использовать defmt для вывода.
panic-probe = { version = "1.0", features = ["print-defmt"] }

Затем подключите его в коде:

#![allow(unused)]
fn main() {
use panic_probe as _;
}

Чтобы посмотреть, как работают сообщения о панике, можно вызвать панику вручную. Попробуйте добавить в код следующую строку:

#![allow(unused)]
fn main() {
panic!("something went wrong");
}