SEGGER RTT (Real Time Transfer)
Отладочный printf через UART занимает вывод, требует настроенного тактирования и тормозит программу на медленной скорости. RTT от SEGGER обходится без лишних выводов: программа пишет текст в буфер в ОЗУ, а отладчик забирает его по тому же интерфейсу SWD, через который прошивает.
Обновлено Редакция GAW
SEGGER RTT (Real Time Transfer) — технология обмена данными между программой микроконтроллера и компьютером через отладчик J-Link. Программа пишет данные в кольцевые буферы в ОЗУ, а J-Link читает их через отладочный интерфейс SWD или JTAG, не останавливая ядро. SEGGER описывает RTT как сочетание преимуществ SWO и semihosting: выводов не больше, чем для прошивки, а скорость высокая.
Как устроено
В ОЗУ лежит блок управления (control block): идентификатор, по которому J-Link его находит, и описатели каналов. Каждый канал — пара кольцевых буферов: «вверх» (от программы к компьютеру) и «вниз» (обратно). Отладчик ищет блок управления сам — сначала по адресу, записанному в таблице векторов со смещением 0x20, затем перебором областей ОЗУ, — или по заданному вручную адресу.
Гонки между программой и отладчиком исключены разделением прав: у буфера «вверх» указатель записи меняет только программа, а указатель чтения — только J-Link; у буфера «вниз» наоборот.
Ресурсы и скорость
| Параметр | По данным SEGGER |
|---|---|
| Код | около 500 байт ПЗУ |
| Блок управления | 24 байта + 24 байта на канал |
| Буфер «вверх» | рекомендуется 1 КБ |
| Буфер «вниз» | 16–32 байта |
| Вывод строки | около 1 мкс и меньше |
Скорость объясняется тем, что вывод сводится к копированию в память; передачей по SWD занимается отладчик.
Если буфер полон
Режим задаётся для каждого канала: блокирующий — программа ждёт, пока отладчик освободит место, данные не теряются; без блокировки — сообщение, которое не помещается, отбрасывается целиком или обрезается по свободному месту. Неблокирующий режим позволяет оставить вывод в релизной прошивке: без подключённого J-Link программа просто работает дальше.
Когда выбрать
RTT удобен на ядрах и в корпусах без трассировки, где нет ITM или вывода SWO, и там, где UART занят. Сравнение UART, SWO, semihosting и RTT, уровни журнала и метки времени — в статье о логировании и трассировке. Возможности отладчиков J-Link перечислены в обзоре программаторов.
Частые вопросы
Чем RTT отличается от SWO?
SWO выводит данные блока ITM по отдельному выводу трассировки, а он есть не у всех ядер и корпусов. RTT использует только память: программа пишет в кольцевой буфер в ОЗУ, отладчик читает его через тот же SWD, что и при прошивке. Поэтому RTT работает и там, где вывода SWO нет, и умеет передавать данные в обратную сторону — от компьютера к программе.
Будет ли программа зависать без подключённого J-Link?
Нет, если канал настроен в неблокирующем режиме: по описанию SEGGER, лишние данные отбрасываются, и программа работает в реальном времени даже без отладчика. Поэтому вызовы RTT можно оставлять в релизной сборке. В блокирующем режиме программа ждёт освобождения места и при отсутствии отладчика остановится.
Какой нужен программатор для RTT?
SEGGER описывает RTT как технологию J-Link: отладчик сам находит блок управления в ОЗУ и читает буферы фоновым доступом к памяти. Некоторые другие отладчики и среды тоже поддерживают формат RTT, но это уже их реализация, а не продукт SEGGER.
Источники
- SEGGER Knowledge Base: RTT (kb.segger.com/RTT), страница по состоянию на октябрь 2026 — RTT — технология двустороннего обмена с целевой системой без влияния на её работу в реальном времени, сочетает преимущества SWO и semihosting; блок управления (control block) и кольцевые буферы каналов в ОЗУ; J-Link ищет блок управления сам (сначала по адресу в таблице векторов со смещением 0x20) или по заданному адресу; у буфера «вверх» указатель записи пишет только целевая программа, указатель чтения — только отладчик, гонок нет; строка текста выводится примерно за 1 мкс и быстрее — по сути время одного memcpy(); код — около 500 байт ПЗУ, блок управления — 24 байта ID и 24 байта на канал; рекомендуемые буферы — 1 КБ «вверх» и 16–32 байта «вниз»; режимы: блокирующий, без блокировки с отбрасыванием всего сообщения, без блокировки с обрезкой; дополнительных выводов не требует, только J-Link на стандартном отладочном порту; для ядер без фонового доступа к памяти есть режим с остановкой CPU
- Arm. ARMv7-M Architecture Reference Manual, DDI 0403E.e, 2021 — разд. C1.7: ITM — регистровый интерфейс для вывода событий в приёмник трассировки; для сравнения: SWO требует отдельного вывода трассировки
Нашли ошибку?
Смотрите также
- Логирование и трассировкаprintf через UART, ITM и SWO, SEGGER RTT, уровни журнала, метки времени
- SWO (вывод трассировки)Однопроводный вывод трассировки и отладочных сообщений Cortex-M
- ITMБлок Cortex-M, который превращает записи программы в пакеты трассировки
- SemihostingМеханизм Arm для ввода-вывода прошивки через подключённый отладчик
- Кольцевой буферОчередь фиксированного размера с индексами головы и хвоста, замкнутая в кольцо
- Программаторы и отладчикиUSBasp, ST-LINK, J-Link, PICkit 5, Snap, CMSIS-DAP, WCH-LinkE: сравнение