Вывод OpenOCD SWO с STM32F4 и буферизация

В системе на основе STM32F4 я использую SWO для вывода трассировки (перехватывая _write() для использования ITM_SendChar() обычным способом). Я могу безошибочно просматривать вывод SWO в Cube IDE ST [на базе Eclipse] с тактовой частотой SWO 2 МГц (тактовая частота ядра 168 МГц); никогда ни единой проблемы. Однако мне нужен поток, который я могу прочитать для целей CI, и я использую OpenOCD [0.10.0+dev-01193-g5ce997d (2020-02-20)], который ST предоставляет в своей цепочке инструментов, с предоставленными ST сценариями настройки, чтобы сделать тот.

Это в основном работает нормально, за исключением примерно 50% времени, когда OpenOCD не записывает конец вывода трассировки. Это точно такое же целевое аппаратное/программное обеспечение, которое я использую с Cube IDE, поэтому это должно быть связано с инструментами на стороне ПК, а не с целевым аппаратным/программным обеспечением. Это выглядит как проблема с буферизацией, поэтому я также попытался заставить OpenOCD экспортировать поток SWO через свой порт сервера TCL вместо записи его в файл, но это ведет себя точно так же.

Целевое аппаратное/программное обеспечение не дает сбоев, по мигающему светодиоду я вижу, что оно выполнено до конца, а стандартная реализация ITM_SendChar() (из заголовков CMSIS) блокирует значение регистра до тех пор, пока символ не будет отправлен, поэтому ничего нельзя пропустить с точки зрения целевого ПО. Но как-то конец отвалился.

Кто-нибудь еще видел это или есть какие-либо советы по теме?

Я вызываю OpenOCD с параметрами:

-c "init" -c "itm port 0 on" -c "tpiu config internal swo.dat uart off 168000000 2000000" -c "reset init" -c "resume"

... и, конечно же, указывая на файлы конфигурации и интерфейса ST STM32F4.

Это все в Windows 10, если это имеет значение.


person Rob    schedule 04.09.2020    source источник


Ответы (1)


В конце концов я понял, как использовать для этого сервер ST-Link GDB, тот, который STM32Cube IDE использует под капотом, поскольку это не показывает проблему. Однако на случай, если у кого-то еще возникнет эта проблема, вот несколько советов, которые я получил от человека, который успешно использует OpenOCD для захвата SWO с платформой STM32F7:

  1. Я использую последнюю версию xpack для openocd (предоставленные ST Cube IDE версии openocd и gcc довольно устарели, и многие проблемы были исправлены с момента их первоначального выпуска).
  2. Мне пришлось добавить события gdb в мой файл .cfg, чтобы заставить порт itm последовательно инициализировать и сбрасывать... используя следующее:
$_TARGETNAME configure -event gdb-detach { itm port 0 off; itm port 1
off; reset; shutdown }
$_TARGETNAME configure -event gdb-attach
{adapter_khz 4000; itm port 0 on; itm port 1 on}
person Rob    schedule 07.09.2020