Hallo,
ich bin dazu über gegangen, Tracing und Logging Informationen nicht
mehr über UART, sondern über SWO auszugeben. Das funktioniert auch sehr
gut, sogar mit 2.25 Mbps.
Allerdings erscheint bei mir die letzte Zeile des Target Output erst
dann auf dem PC, wenn GDB oder das "swolisten" Programm beendet wird.
Manchmal erscheint der fehlende Output auch, wenn das Target mit dem
"run" Befehl neu gestartet wird.
Ich frage mich, warum das so ist und wie ich dafür sorgen kann, dass
auch die letzte Ausgabe sofort ausgegeben wird. Kann mir jemand einen
Tipp geben, in welche Richtung ich weiter vorgehen kann?
Ist das Buffering eher im Prinzip des STM32 Embedded Trace Macro (ETM),
in der BMP Firmware oder im Anzeigeprogramm "swolisten" zu suchen?
Das ganze ist recht ärgerlich da in meinem Setup die letzte Zeile
typischerweise der "assert()" Output ist und darauf hinweist, wo der
Fehler liegt.
Beispiel zur Illustration (letzte beide Ausgabe-Zeilen des Targets):
1 | (...)
|
2 | [USB] --> UsbCoreViaSTM32F4::handleIrq(irqStatus=0x4000023)
|
3 | void (...) handleModeMismatchIrq() const() @ (...) UsbCore.cpp : 371
|
Die Zeile #371 besteht nur aus einer Assertion:
1 | void
|
2 | UsbCore::handleModeMismatchIrq(void) const {
|
3 | assert(false);
|
4 | }
|
Die Assertion löst im Prinzip auf folgendes auf:
1 | (...)
|
2 | debug_printf("%s() @ %s : %d \r\n%s\r\n", p_func, p_file, p_line, p_msg);
|
3 |
|
4 | while (1) { __NOP(); };
|
Die debug_printf() Funktion nutzt für jedes auszugebende Zeichen das
ITM_SendChar() Makro.
Im Debugger sieht man schon, dass das Target in der while(1)-Loop hängt;
aber der printf() Output davor kommt nicht mehr auf dem PC an.
Falls notwendig, hier noch ein paar Infos zum Setup:
Ich verwende Black Magic Probe (BMP) v1.7.1 auf einem billigen ST-Link
Clone mit CKS... Fake-STM32F103.
Den SWO Pin (PA10) des BMP/ST-Link Device habe ich über ein direkt am µC
angelötetes Stück dünne Litze nach außen geführt. Über einen
angecrimpten Stecker habe ich die Leitung an SWO Pin (PB3) des Target
angeschlossen.
Das Target Board ist ein STM32F401CC "Black Pill" Board dieser Art:
https://stm32-base.org/boards/STM32F411CEU6-WeAct-Black-Pill-V2.0.html
Den TRACESWO Output schaue ich mir im Terminal mit
unter macOS 10.15 an.
Den SWO Output im Target habe ich grob entlang dieser Anleitung
implementiert:
https://github.com/blacksphere/blackmagic/blob/master/UsingSWO