Percepio Tracealyzer и FreeRTOS: выгружаем трассировку с микроконтроллера

Перевод статьи Using Tracealyzer for Embedded Systems Analysis — Erich Styger, MCU on Eclipse.
В своём последнем исследовательском проекте я использую плату NXP FRDM-MCXN947. В рамках проекта мне нужно собирать и выгружать трассировку работы приложения для последующего анализа. Для этого я применяю Tracealyzer от Percepio.

Данные трассировки в Percepio Tracealyzer
В этой статье я опишу разные способы выгрузить данные трассировки с целевого устройства: с помощью стандартных команд GDB или через TraceExporter для VS Code.
Общая схема#
При работе с Tracealyzer приложение инструментируется так, чтобы записывать события системы. Данные можно передавать потоком, например через SEGGER RTT, или записывать в кольцевой буфер.
Кольцевой буфер хорош тем, что данные пишутся без отладочной сессии. Потом можно подключиться отладчиком и забрать последние данные из буфера. Другой вариант — поставить точку останова в колбэке «буфер заполнен» (OnTraceWrap()) и сохранять данные в этот момент.
В статье я использую VS Code с отладкой через NXP LinkServer на плате FRDM-MCXN947. Всё прекрасно работает как с расширением cortex-debug, так и с mcuxpresso-debug.

Плата NXP FRDM-MCXN947
Настройка трассировки в кольцевой буфер#
В моём приложении данные трассировки записываются в кольцевой буфер.
Для этого библиотека трассировки инициализируется так:
vTraceEnable(TRC_START);
Настройка McuLib#
В проекте используется McuLib со следующей конфигурацией:
/* FreeRTOS */
#define McuLib_CONFIG_SDK_USE_FREERTOS (1)
#define configUSE_TRACE_FACILITY (1)
#define configGENERATE_RUN_TIME_STATS (1)
#define configGENERATE_RUN_TIME_STATS_USE_TICKS (1)
/* Tracealyzer */
#define configUSE_PERCEPIO_TRACE_HOOKS (1) /* Percepio Tracealyzer */
#define McuPercepio_CONFIG_START_TRACE_IN_STARTUP_MODE TRC_INIT /* TRC_INIT: only initialize trace, start it later with */
#define McuPercepio_CONFIG_RECORDER_MODE TRC_RECORDER_MODE_SNAPSHOT /*TRC_RECORDER_MODE_STREAMING*/
#if McuPercepio_CONFIG_RECORDER_MODE==TRC_RECORDER_MODE_SNAPSHOT
/* overwrite defaults in trcSnapshotConfig.h */
#define TRC_CFG_SNAPSHOT_MODE TRC_SNAPSHOT_MODE_RING_BUFFER /* TRC_SNAPSHOT_MODE_STOP_WHEN_FULL */
#define TRC_CFG_EVENT_BUFFER_SIZE (50)
#endif
Выгрузка данных через GDB#
Один из способов выгрузить данные — команда GDB dump.
Код ниже в колбэке формирует команду GDB вида
dump binary memory <file> <hexStartAddr> <hexEndAddr>
void McuPercepio_OnTraceWrap(void)
{
uint8_t buf[64];
#define TRACE_DUMP_FILE_NAME "trc.dump"
/* GDB: dump binary memory <file> <hexStartAddr> <hexEndAddr> */
McuPercepio_vGetGDBDumpCommand(buf, sizeof(buf), (unsigned char*)TRACE_DUMP_FILE_NAME);
/* Hint: set a breakpoint on the exit of this function. Then use a gdb/debug console to execute the command in buf:
eval "%s", buf
*/
}
Теперь можно поставить точку останова и командой GDB eval выполнить команду из буфера — данные сохранятся в файл:

Выгрузка данных командами GDB eval и dump (mcuxpresso-debug)
Правда, синтаксис команды немного различается в зависимости от используемого расширения VS Code:
- cortex-debug:
eval \"%s\",buf - mcuxpresso-debug:
eval "%s",buf
TraceExporter для VS Code#
Percepio выпускает расширение для VS Code: https://percepio.com/traceexporter-for-vs-code/. На момент написания статьи я использую версию 0.3.1.
Расширение устанавливается из файла .vsix.
С ним можно остановить target в любом месте и нажать кнопку «Save Trace»:

Выгрузка трассировки с помощью Percepio TraceExporter
Дополнительный плюс расширения — кнопка для просмотра данных трассировки:

Кнопка View Trace
Убедитесь, что исполняемый файл Percepio Tracealyzer доступен через PATH. Тогда по кнопке откроется Tracealyzer с выгруженными данными:

Данные трассировки в Percepio Tracealyzer
Итоги#
Раньше для выгрузки трассировки я пользовался стандартными командами GDB. Это работает и с GDB из командной строки, и с GDB внутри VS Code. Но если вы работаете в VS Code, очень удобно расширение Percepio: одной кнопкой данные выгружаются, другой — открываются для анализа. Всё становится очень просто.
Помимо описанных способов выгрузки есть и ещё один — через semihosting, см. https://mcuoneclipse.com/2026/06/01/semihosting-with-linkserver-in-vs-code/.
Удачной трассировки 🙂
Ссылки#
- Percepio Tracealyzer: https://percepio.com/tracealyzer/
- Расширение NXP для VS Code: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-for-visual-studio-code:MCUXPRESSO-VSC
- TraceExporter для VS Code: https://percepio.com/traceexporter-for-vs-code/
- FRDM-MCXN947: https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXN947
- McuLib: https://github.com/ErichStyger/McuLib