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");
}