Получение дополнительных байтов с использованием полухостинга на чипе STM32L4 с openocd и gdb

Я пытаюсь получить отладочный вывод, используя вывод SWO с openocd версия 0.10.0+dev-00512-gfd044600 а также gdb-multiarch,

Я скомпилировал прошивку с ARMToolchain_8-2018-q4 с флагами --specs=nosys.specs --specs=nano.specs --specs=rdimon.specsпоставь вызов функции initialise_monitor_handles(); в main(), мой .gdbinit выглядит так:

target extended-remote localhost:3333
monitor reset halt
monitor arm semihosting enable
monitor tpiu config internal ../bin/swo.log
load
break main

Я установил звонок ITM_SendChar() в _putchar() функционировать так:

void _putchar(char c) { ITM_SendChar(c) };

Микросхема STM32L432KC и команда openocd:

openocd -f board/stm32l4discovery.cfg

Когда я печатаю строку "Test\r\n", я получаю несколько дополнительных символов в swo.log файл (вывод из xxd -b swo.log):

000032e8: 00000001 01010100 00000001 01100101 00000001 01110011  .T.e.s
000032ee: 00000001 01110100 00000001 00001101 00000001 00001010  .t....

Строка "Test\r\n" есть, но с дополнительным мусором. Как я могу избавиться от этого?

Мой обходной путь теперь состоит в том, чтобы вырезать непечатаемые символы с помощью:

tail -f ../bin/swo.log | tr -cd '\11\12\15\40-\176'

1 ответ

Решение

Канал ITM может обрабатывать 8-, 16- и 32-битные данные.

ITM_SendChar() использует 8-битный (1-байтовый) поток, поэтому у вас есть 1 в каждом другом байте как длина последующей части данных.

За swo.log Расшифровка можно использовать Perl-скрипт из этого поста.

Просто чтобы уточнить, "полухостинг" и "SWO" - это совершенно разные понятия. То, что вы описываете, не использует полухостинг, поэтому вы можете пропустить --specs=rdimon.specs, initialise_monitor_handles(); а также monitor arm semihosting enable поскольку они не связаны с вашей проблемой.

Полуохостинг - это способ, позволяющий хост-системе реализовывать некоторые системные вызовы, имея цель заполнить некоторые структуры данных в памяти и затем выполнить точку останова. Это запускает узел отладки (OpenOCD), который затем читает аргументы из целевой памяти, эмулирует системный вызов, записывает результат обратно в память и, наконец, возобновляет цель. Это можно использовать как stdout канал, но и многое, многое другое (stdinполная эмуляция файловой системы и т. д.). Недостатком является то, что цель останавливается во время системного вызова, поэтому метод очень навязчив.

SWO, с другой стороны, является легким каналом трассировки, который, помимо прочего, может выводить произвольные данные через любой из 32 каналов блока ITM. Это может быть полезно как ненавязчивое stdout канал. Другие типы данных также могут быть направлены через выход SWO; временные метки, выборки с ПК, DWT-трассировки переменного доступа, счетчики производительности и многое другое. Это мультиплексирование требует кадрирования вокруг каждого типа данных, который вы видите как дополнительные байты в лог-файле SWO. Поток данных может быть декодирован такими утилитами, как Swodec.

Другие вопросы по тегам