В системе на основе 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, если это имеет значение.