Перейти к содержанию

ITM (Instrumentation Trace Macrocell)

В ядрах Cortex-M3 и M4 есть встроенный канал отладочного вывода, для которого не нужен ни UART, ни его настройка. Программа записывает символ в специальный регистр, а блок ITM сам упаковывает его и отправляет отладчику через вывод SWO.

Обновлено Редакция GAW

ITM (Instrumentation Trace Macrocell) — блок отладки в ядрах ARMv7-M (Cortex-M3, M4, M7), через который программа выводит данные трассировки. Справочник по архитектуре описывает его как регистровый интерфейс: приложение записывает слово в порт-стимул, ITM упаковывает его в пакет и отправляет в приёмник трассировки. Метки времени — необязательная функция: если она реализована и включена, ITM добавляет их отдельными пакетами. Чаще всего поток выводится через вывод SWO, который читает отладчик.

Регистры

РегистрНазначение
ITM_STIM0…255порты-стимулы, запись байта, полуслова или слова
ITM_TER0…7по биту разрешения на каждый порт
ITM_TPRкакие группы по восемь портов доступны непривилегированному коду
ITM_TCRобщее разрешение ITMENA, метки времени, синхронизация

Число портов зависит от реализации и кратно восьми. ITMENA при включении питания сброшен, поэтому ITM молчит, пока отладчик или программа его не включат; запись в выключенный порт просто игнорируется. ITM объединяет программные пакеты с аппаратными событиями блока DWT — так в одном потоке оказываются и сообщения, и, например, данные счётчика тактов DWT.

Вывод символа

В CMSIS для этого есть готовая функция ITM_SendChar(): она проверяет, включён ли ITM и порт 0, дожидается готовности порта и записывает байт. Если отладчик не подключён и ITM выключен, функция сразу возвращается — программа не зависает. Достаточно перенаправить в неё вывод printf, и текст появится в окне трассировки среды разработки.

Ограничения

  • Нужен путь для потока трассировки: вывод SWO, параллельный порт трассировки TPIU или встроенный буфер трассировки ETB — и отладчик, который умеет его принимать. На микросхеме, где выведен только SWD, ITM бесполезен.
  • Блок есть не во всех ядрах: у Cortex-M0 и M0+ (архитектура ARMv6-M) ITM нет, а в Cortex-M3, по его техническому описанию, ITM — необязательный блок, который изготовитель может не включить.
  • Пропускная способность ограничена частотой SWO, а буфер ITM мал, поэтому при плотном выводе программа ждёт.

Где SWO нет, похожую задачу решает SEGGER RTT — через память и обычный SWD. Настройка ITM и SWO на STM32, перенаправление printf и сравнение каналов вывода — в статье о логировании и трассировке; устройство отладочных блоков ядра — на странице Cortex-M3.

Частые вопросы

Как направить printf в ITM?

Переопределить функцию вывода библиотеки так, чтобы каждый символ уходил в ITM_SendChar() из CMSIS: в newlib это _write(), в STM32Cube-проектах — __io_putchar(). Отладчик должен включить трассировку и вывод SWO с правильной частотой, иначе ITM выключен и функция просто возвращает символ.

Сколько каналов у ITM?

Архитектура ARMv7-M допускает до 256 портов-стимулов, их число в конкретном ядре кратно восьми; в CMSIS для Cortex-M3 описано 32 порта. Обычно порт 0 используют для текстового вывода, остальные — для меток событий или двоичных данных, которые отладчик показывает отдельно.

Замедляет ли ITM программу?

Запись в порт-стимул — одна команда, но буфер ITM маленький: архитектура требует минимум одну запись, общую для всех портов. Если SWO медленнее потока сообщений, ITM_SendChar() ждёт освобождения порта. Поэтому скорость SWO подбирают как можно выше, а длинные сообщения в прерываниях не пишут.

Источники

  1. Arm. ARMv7-M Architecture Reference Manual, DDI 0403E.e, 2021 — разд. C1.7: ITM даёт приложению регистровый интерфейс для записи событий журнала в приёмник трассировки, например во внешний TPIU, формирует пакеты по протоколу приложения D4 и объединяет их с аппаратными пакетами блока DWT; C1.7.1: до 256 портов-стимулов ITM_STIM0–255 (число кратно восьми), до восьми регистров разрешения ITM_TER0–7, регистр привилегий ITM_TPR и управляющий регистр ITM_TCR; ITM_TCR.ITMENA — общее разрешение, сбрасывается при включении питания; метки времени — необязательные отдельные пакеты (Local и Global timestamps); разд. C1.10: поток ITM выводится через TPIU — асинхронный SWO или параллельный порт трассировки — либо завершается во встроенном буфере ETB; запись в выключенный порт игнорируется; минимум — буфер на одну запись, общий для всех портов
  2. Arm. CMSIS 6.4.0: CMSIS/Core/Include/core_cm3.h — структура ITM_Type: массив PORT[32] с доступом u8, u16, u32; функция ITM_SendChar() проверяет ITM_TCR.ITMENA и разрешение порта 0, ждёт готовности порта и пишет байт; без подключённого отладчика просто возвращается; входящие символы — через переменную ITM_RxBuffer
  3. Arm. Cortex-M3 Processor Technical Reference Manual, revision r2p1 (100165) — обзор отладки: необязательные блоки DWT, ITM (поддержка отладки в стиле printf), TPIU и ETM

Нашли ошибку?