Просто, чтобы уточнить, «полухостинг» и «SWO» - это совершенно разные понятия. То, что вы описываете, не использует полухостинг, поэтому вы можете пропустить --specs=rdimon.specs
, initialise_monitor_handles();
и monitor arm semihosting enable
, поскольку они не связаны с вашей проблемой.
Полухостинг - это способ, позволяющий хост-системе реализовывать некоторые системные вызовы, имея цель заполнить некоторые структуры данных в памяти и затем выполнить точку останова. Это запускает узел отладки (OpenOCD), который затем читает аргументы из целевой памяти, эмулирует системный вызов, записывает результат обратно в память и, наконец, возобновляет цель. Это может использоваться как канал stdout
, но также и для гораздо большего (stdin
, полная эмуляция файловой системы и т. Д.). Недостатком является то, что цель останавливается во время системного вызова, поэтому метод очень навязчив.
С другой стороны, SWO - это легкий канал трассировки, который, помимо прочего, может выводить произвольные данные через любой из 32 каналов блока ITM. Это может быть полезно в качестве ненавязчивого канала stdout
. Другие типы данных также могут быть направлены через выход SWO; временные метки, выборки с ПК, DWT-трассировки переменного доступа, счетчики производительности и многое другое. Это мультиплексирование требует кадрирования вокруг каждого типа данных, который вы видите как дополнительные байты в лог-файле SWO. Поток данных может быть декодирован такими утилитами, как Swodec .