Получение дополнительных байтов с использованием полухостинга на чипе STM32L4 с openocd и gdb - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь получить отладочный вывод, используя вывод 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'

Ответы [ 2 ]

2 голосов
/ 13 июля 2019

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

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

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

2 голосов
/ 21 марта 2019

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

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

Для декодирования swo.log можно использовать скрипт perl из этого поста .

...