So fälschen Sie den Vordergrund für ein im Hintergrund gestartetes Programm (Linux und Darwin)
Posted: 12 Jan 2025, 04:33
Das Open-Source-Tool Trice ermöglicht die Verwendung von RTT für die Datenübertragung. Leider handelt es sich bei den bereitgestellten SEGGER-Tools um Closed-Source-Tools und das optionale und kostenpflichtige SDK ermöglicht keine kostenlose Verteilung der kompilierten Binärdateien. Ich habe einen zuverlässigen Weg gefunden, JLinkRTTLogger (Closed Source) zu verwenden, indem ich es im Hintergrund startete und die Zwischendatendatei im Trice-Tool verarbeitete. Das funktioniert gut unter Windows. Bei Darwin und Linux scheint das anders zu sein. Ich muss JLinkRTTLogger in einem Terminal starten und kann von einem zweiten Terminal aus auf die Zwischendatendatei zugreifen. Es sieht so aus:
Terminal 1:
Terminal 2:
Für meinen Geschmack ist das etwas unpraktisch für die Entwickler, aber ich bekomme keine Verbindung, wenn ich JLinkRTTLogger nicht im Vordergrund starte:
Es bleibt hier hängen und sobald ich fg eingebe wird eine Verbindung hergestellt:
Meine Frage ist, wie ein laufendes Programm feststellt, ob es sich im Vordergrund oder im Hintergrund befindet, und wie ich dem im Hintergrund laufenden Programm „Vordergrund“ vortäuschen könnte. Das Trice-Tool ist in Go geschrieben und nutzt das Exec-Paket zum Starten von JLinkRTTLogger (erfolgreich nur unter Windows, sonst stellt es keine Verbindung her). /usr/local/go/src/os/exec/exec.go:
Ich bezweifle, eine Zielverbindung zu erhalten, indem ich zuerst intern eine Shell aufrufe, da, wie gezeigt, der &-Operator die betreffende Funktionalität bereits blockiert.
Ich habe erfolglos nach einer Lösung gesucht und bin nur auf die Idee gekommen, eine virtuelle Maschine zu verwenden, was keine clevere Lösung zu sein scheint. Ich kenne openOCD, aber es gibt noch andere Probleme.
Terminal 1:
Code: Select all
rm ./temp/trice.bin && JLinkRTTLogger -Device STM32G0B1RE -If SWD -Speed 4000 -RTTChannel 0 ./temp/trice.bin
SEGGER J-Link RTT Logger
...
Getting RTT data from target. Press any key to quit.
------------------------------------------------------------
Transfer rate: 0 Bytes/s Data written: 3.27 KB
Code: Select all
touch ./temp/trice.bin && trice log -p FILE -args ./temp/trice.bin -prefix off -hs off -d16 -ts ms -i ../../demoTIL.json -li ../../demoLI.json -pf none
triceExamples.c 12 0,000 Hello! 👋🙂
...
Code: Select all
JLinkRTTLogger -Device STM32G0B1RE -If SWD -Speed 4000 -RTTChannel 0 ./temp/trice.bin &
[4] 86285
th@P51-DebianKDE:~/repos/trice/examples/G0B1_inst$ SEGGER J-Link RTT Logger
Compiled Dec 18 2024 15:48:21
(c) 2016-2017 SEGGER Microcontroller GmbH, www.segger.com
Solutions for real time microcontroller applications
Default logfile path: /home/th/.config/SEGGER
------------------------------------------------------------
------------------------------------------------------------
Connected to:
SEGGER J-Link ST-LINK
S/N: 779220206
Searching for RTT Control Block...
Code: Select all
...
Searching for RTT Control Block...fg
JLinkRTTLogger -Device STM32G0B1RE -If SWD -Speed 4000 -RTTChannel 0 ./temp/trice.bin
OK.
1 up-channels found:
0: Terminal
Selected RTT Channel description:
Index: 0
Name: Terminal
Size: 1024 bytes.
Output file: ./temp/trice.bin
Getting RTT data from target. Press any key to quit.
------------------------------------------------------------
Transfer rate: 734 Bytes/s Data written: 50.44 KB
Code: Select all
// Unlike the "system" library call from C and other languages, the
// os/exec package intentionally does not invoke the system shell and
// does not expand any glob patterns or handle other expansions,
// pipelines, or redirections typically done by shells. The package
// behaves more like C's "exec" family of functions. To expand glob
// patterns, either call the shell directly, taking care to escape any
// dangerous input, or use the [path/filepath] package's Glob function.
Ich habe erfolglos nach einer Lösung gesucht und bin nur auf die Idee gekommen, eine virtuelle Maschine zu verwenden, was keine clevere Lösung zu sein scheint. Ich kenne openOCD, aber es gibt noch andere Probleme.