Forum: Mikrocontroller und Digitale Elektronik st-flash, openocd STLINK/V2 command line tool f. Windows


von Christoph K. (chriskuku)


Lesenswert?

Bin mir immer noch nicht sicher, unter welchem OS und welcher Plattform 
ich  das STM32F4 Projekt entwickeln bzw. debuggen soll, je mehr ich 
lese.

Angefangen hatte ich, als ich mit 2 kleinen Zeilen im macOS Terminal
das Nucleo F411RE mit mecrisp-forth flashen konnte und es war ein 
totales Erfolgserlebnis. Das war, als ich bereits versucht hatte, die 
GNU MCU32 CDT unter Eclipse (macOS) zu installieren, aber irgendwie hing 
ich am QEMU und xPack fest.

Hatte dann STMCube und STM32-STLINK-Utility probiert. Jetzt suche ich 
nach den Pendants zu st-flash unter Windows. Gibt's das 1:1 ?

Dann lese ich noch, daß das discovery Board auch ohne IC-debugger 
STLINK/V2 direkt, also ohne Hardware (SWD) unterstützt. Und das könne 
auch über OpenOCD geschehen. Man könne sogar den gdb mit dem OOCD server 
(target:3333) verbinden.

Eigentlich bevorzuge ich vi und command-line tools, wobei ich dies im 
Moment lieber unter Windows 10 hätte, weil das Bedienprogramm des 
Projekts auch unter Windows läuft.

Eure Meinung/Hilfe sehr willkommen.

Grüße
Christoph

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Ich würde einfach den STM32Workbench und einen richtigen externen 
ST_Link v2 oder v3Mini nehmen.

Damit bist du fertig und kannst in Zukunft auf allen STM32 entwickeln ob 
nackt oder auf nem Eval Board.

von Johannes S. (Gast)


Lesenswert?

Mbed ist Multi Kulti, entwickeln gebt mit dem mbed-cli am Besten und das 
läuft unter Linux/Mac/Windows. Installieren ist unter Windows am 
einfachsten, da gibt es einen Installer, Mac weiss ich nicht, Linux sind 
ein paar manuelle Schritte die man nach der Anleitung auch hinbekommt.
https://os.mbed.com/docs/mbed-os/v6.2/quick-start/build-with-mbed-cli.html

Dann das Blinky von Github klonen:
https://github.com/ARMmbed/mbed-os-example-blinky

da die Schritte 1,2,3 befolgen.
Kompilieren mit 'mbed compile -t GCC_ARM -m NUCLEO_F411RE' oder noch mit 
Schalter '-f' dahinter, dann sollte direkt geflasht werden (wenn der 
STLink auf dem Board aktuell ist).

Als schlanke IDE geht VSCode gut, da kann man das compile Kommando als 
Task einbauen. Mit Cortex-Debug Extension lässt sich auch debuggen.
Ein Mbed-Studio gibt es mittlerweile auch, ich weiss aber nicht ob das 
mittlerweile auf dem Mac läuft.

von Cyblord -. (cyblord)


Lesenswert?

Christoph K. schrieb:
> Jetzt suche ich
> nach den Pendants zu st-flash unter Windows. Gibt's das 1:1 ?

1:1 eher nicht. Aber beide Windows ST-Flasher (ST-Link Utility und 
STM32CubeProgrammer) sollten ein CLI haben.

von Philip S. (phs)


Lesenswert?

Ich verwende OpenOCD unter macOS, Ubuntu und Windows, sowohl zum Flashen 
als auch zum Debuggen (mit GDB). Unter anderem auch mit einem Nucleo 
F411RE.

OpenOCD funktioniert in meinem Fall zweistufig:

1. Starten des Servers:
1
openocd -f <Config File>.cfg -c "gdb_port 4242" -c "telnet_port 4444"

2. Flashen über's Telnet Interface von OpenOCD:
1
echo program firmware.elf verify reset | nc localhost 4444

Punkt (2) braucht halt eine Pipe-fähige Shell.

Das Flashen lässt sich bei Bedarf aber auch in eine Zeile packen; dabei 
wird dann kein Server-Prozess gestartet.
1
openocd -f <Config File>.cfg -c "program firmware.elf verify reset exit"

Mir gefällt dabei v.a., dass es unabhängig von IDEs ist. Ich habe das so 
schon in Kombination mit verschiedene IDEs / Editoren verwendet.

von Nop (Gast)


Lesenswert?

Philip S. schrieb:

> OpenOCD funktioniert in meinem Fall zweistufig:

Wenn man nur flashen will, kann man das auch in ein einziges cfg-Script 
packen. Das ist nützlich, um es dem Projekt beizulegen.

von Uwe Bonnes (Gast)


Lesenswert?

Philip S. schrieb:

> OpenOCD funktioniert in meinem Fall zweistufig:

Blackmagic kann man inzwischen auch fuer den PC kompilieren und auf BMP 
Firmware  Probes, Stlink V2 und V3, Libftdi/MPSSE Adaptern und CMSIS DAP 
Adaptern laufen lassen. "blackmagic <file.bin>" flasht dann an den Start 
des Flashbereich und kennt weitere Parameter. Ohne Argumente 
"blackmagic" wird auf Port 2000 der GDB Server gestartet. Jlink geht im 
Prinzip auf, nur schnarchlagsam...

von Christoph K. (chriskuku)


Lesenswert?

Philip S. schrieb:
> Ich verwende OpenOCD unter macOS, Ubuntu und Windows, sowohl zum Flashen
> als auch zum Debuggen (mit GDB). Unter anderem auch mit einem Nucleo
> F411RE.
>
> OpenOCD funktioniert in meinem Fall zweistufig:
>
> 1. Starten des Servers:
>
1
openocd -f <Config File>.cfg -c "gdb_port 4242" -c "telnet_port 
2
> 4444"
>

Danke. Versuch's gerade unter macOS im Terminal.
Der Server scheint nicht zu starten, gibt aber auch keine Fehlermeldung:

$ pwd
/Users/kuku/opt/xpack-openocd-0.10.0-14
$ sudo bin/openocd  -f scripts/board/stm32f4discovery.cfg -c "gdb_port 
4242" -c "telnet_port 4444"
Password:
xPack OpenOCD, x86_64 Open On-Chip Debugger 0.10.0+dev-00378-ge5be992df 
(2020-06-26-12:31)
Licensed under GNU GPL v2
For bug reports, read
  http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The 
results might differ compared to plain JTAG/SWD
srst_only separate srst_nogate srst_open_drain connect_deassert_srst

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 2000 kHz


$ lsof -i :4444
$ lsof -i :4242
$

von Philip S. (phs)


Lesenswert?

Christoph K. schrieb:
>
> Danke. Versuch's gerade unter macOS im Terminal.
> Der Server scheint nicht zu starten, gibt aber auch keine Fehlermeldung:
>
> $ pwd
> /Users/kuku/opt/xpack-openocd-0.10.0-14
> $ sudo bin/openocd  -f scripts/board/stm32f4discovery.cfg -c "gdb_port
> 4242" -c "telnet_port 4444"
> Password:

Mmmh.

"Bei mir tut's". ;-)
1
➜  ~ openocd -f /usr/local/share/openocd/scripts/board/stm32f4discovery.cfg -c "gdb_port 4242" -c "telnet_port 4444"     
2
Open On-Chip Debugger 0.10.0
3
Licensed under GNU GPL v2
4
For bug reports, read
5
  http://openocd.org/doc/doxygen/bugs.html
6
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
7
adapter speed: 2000 kHz
8
adapter_nsrst_delay: 100
9
none separate
10
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
11
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
12
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
13
Info : clock speed 1800 kHz
14
Info : STLINK v2 JTAG v37 API v2 SWIM v0 VID 0x0483 PID 0x3748
15
Info : using stlink api v2
16
Info : Target voltage: 2.869321
17
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints

Unterschiede, die ich sehe:

- Ich hab' OpenOCD mittels HomeBrew installiert.
- Ich starte OpenOCD ohne sudo -- hat bei mir aber auch mit sudo 
funktioniert.

Ich hab's eben auch mit einem STM32F4 Discovery probiert. Wenn ich 
stattdessen die selbe .cfg Datei, aber ein anderes phys. Board (Nucleo 
STM32F411RE) verwende, dann steigt OpenOCD mit einem Fehler aus.
1
➜  ~ openocd -f /usr/local/share/openocd/scripts/board/stm32f4discovery.cfg -c "gdb_port 4242" -c "telnet_port 4444"
2
Open On-Chip Debugger 0.10.0
3
Licensed under GNU GPL v2
4
For bug reports, read
5
  http://openocd.org/doc/doxygen/bugs.html
6
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
7
adapter speed: 2000 kHz
8
adapter_nsrst_delay: 100
9
none separate
10
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
11
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
12
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
13
Info : clock speed 1800 kHz
14
Error: open failed
15
in procedure 'init' 
16
in procedure 'ocd_bouncer'

Tut mir leid, ich weiss nicht wie man das ordentlich debugt; das hat bei 
mir immer auf Anhieb funktioniert.

von Christoph K. (chriskuku)


Lesenswert?

Danke. Es gilt mal wieder die alte Regel: "Einschalten erhöht die 
Empfindlichkeit" :)

Hatte das Board nicht unter Spannung/angeschlossen.
 bin/openocd -f scripts/board/stm32f4discovery.cfg -c "gdb_port 4242" -c 
"telnet_port 4444"
xPack OpenOCD, x86_64 Open On-Chip Debugger 0.10.0+dev-00378-ge5be992df 
(2020-06-26-12:31)
Licensed under GNU GPL v2
For bug reports, read
  http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The 
results might differ compared to plain JTAG/SWD
srst_only separate srst_nogate srst_open_drain connect_deassert_srst

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 2000 kHz
Info : STLINK V2J37M26 (API v2) VID:PID 0483:3752
Info : Target voltage: 2.892781
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f4x.cpu on 4242
Info : Listening on port 4242 for gdb connections


und wartet ...

Gut, kann man wahrscheinlich auch in den Hintergrund schieben
So, jetzt muß ich erst mal lesen, wie man gdb mit openocd benutzt.

Muß wahrscheinlich .elf Images nehmen.

von Philip S. (phs)


Lesenswert?

Christoph K. schrieb:
> So, jetzt muß ich erst mal lesen, wie man gdb mit openocd benutzt.
>
> Muß wahrscheinlich .elf Images nehmen.

Ich hab’ das hier in meiner .gdbinit stehen:
1
file firmware.elf
2
target remote localhost:4242
3
load firmware.elf

von Christoph K. (chriskuku)


Lesenswert?

Philip S. schrieb:
> Christoph K. schrieb:
>> So, jetzt muß ich erst mal lesen, wie man gdb mit openocd benutzt.
>>
>> Muß wahrscheinlich .elf Images nehmen.
>
> Ich hab’ das hier in meiner .gdbinit stehen:
>
>
1
> file firmware.elf
2
> target remote localhost:4242
3
> load firmware.elf
4
>

Danke. Es scheint zu funktionieren. Zumindest erscheint keine 
Fehlermeldung. Aber ich bekomme irgendwie noch kein Zeichen vom 
Programm, wenn ich "continue" eingebe. Es sollte etwas auf USART3 
schreiben.
Die virtuelle COM und das Debug-Interface stehen sich ja nicht im Wege?

Das ist der openOCD-Aufruf:
1
/Users/kuku/opt/xpack-openocd-0.10.0-14/bin/openocd -f /Users/kuku/opt/xpack-openocd-0.10.0-14/scripts/board/st_nucleo_f4.cfg -c "gdb_port 4242" -c "telnet_port 4444"
2
3
Und der prompt des servers auf der Console:
4
xPack OpenOCD, x86_64 Open On-Chip Debugger 0.10.0+dev-00378-ge5be992df (2020-06-26-12:31)
5
Licensed under GNU GPL v2
6
For bug reports, read
7
  http://openocd.org/doc/doxygen/bugs.html
8
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
9
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
10
11
Info : Listening on port 6666 for tcl connections
12
Info : Listening on port 4444 for telnet connections
13
Info : clock speed 2000 kHz
14
Info : STLINK V2J23M9 (API v2) VID:PID 0483:374B
15
Info : Target voltage: 3.229863
16
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
17
Info : starting gdb server for stm32f4x.cpu on 4242
18
Info : Listening on port 4242 for gdb connections
19
Info : accepting 'gdb' connection on tcp/4242
20
target halted due to debug-request, current mode: Thread 
21
xPSR: 0x61000000 pc: 0x0000151e msp: 0x200002fc
22
Info : device id = 0x10006431
23
Info : flash size = 512 kbytes
24
Info : flash size = 512 bytes
Anm: flash erase und flashen tut das openOCD nicht? Oder nur auf Geheiß?

Und die gdb-session:
1
$ /Users/kuku/opt/gcc-arm-none-eabi-8-2018-q4-major/bin/arm-none-eabi-gdb
2
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
3
Copyright (C) 2018 Free Software Foundation, Inc.
4
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
This is free software: you are free to change and redistribute it.
6
There is NO WARRANTY, to the extent permitted by law.
7
Type "show copying" and "show warranty" for details.
8
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
9
Type "show configuration" for configuration details.
10
For bug reporting instructions, please see:
11
<http://www.gnu.org/software/gdb/bugs/>.
12
Find the GDB manual and other documentation resources online at:
13
    <http://www.gnu.org/software/gdb/documentation/>.
14
15
For help, type "help".
16
Type "apropos word" to search for commands related to "word".
17
0x0000151e in serial_qkey ()
18
Loading section .text, size 0x3b00 lma 0x0
19
Start address 0x0, load size 15104
20
Transfer rate: 120832 bits in <1 sec, 15104 bytes/write.
21
(gdb) continue
22
Continuing.
23
24
(gdb)
Was aber geht, ist, wenn ich den RESET-Knopf drücke, daß dann das 
Programm läuft und ich im picocom den Prompt sehe.

^C im gdb unterbricht dann.

: Bearbeitet durch User
von Philip S. (phs)


Lesenswert?

Christoph K. schrieb:

> Die virtuelle COM und das Debug-Interface stehen sich ja nicht im Wege?
>

Nein, die sollten sich nicht ausschließen.

> Das ist der openOCD-Aufruf:
>
> [code]/Users/kuku/opt/xpack-openocd-0.10.0-14/bin/openocd -f
> /Users/kuku/opt/xpack-openocd-0.10.0-14/scripts/board/st_nucleo_f4.cfg
> -c "gdb_port 4242" -c "telnet_port 4444"
> [...]
> Anm: flash erase und flashen tut das openOCD nicht? Oder nur auf Geheiß?
>

Richtig. Wenn Du OpenOCD so startest, dann wird es nur als Server 
funktionieren. Über's Telnet Interface kannst Du Kommandos an OpenOCD 
schicken; auf dem GDB Port lauscht der GDB Server.

Für die Optionen zum Flashen via OpenOCD siehe Beitrag #6398475 weiter 
oben:
> echo program firmware.elf verify reset | nc localhost 4444
[...]
> openocd -f <Config File>.cfg -c "program firmware.elf verify reset exit"

Letztere Option beißt sich aber mit dem OpenOCD Server da der Programmer 
sonst zwei mal geöffnet werden würde. Das ist eigentlich eher dann 
relevant, wenn Du keinen GDB Server brauchst oder willst.

> Was aber geht, ist, wenn ich den RESET-Knopf drücke, daß dann das
> Programm läuft und ich im picocom den Prompt sehe.
>
> ^C im gdb unterbricht dann.

Ja, so wie ich das verstehe hast Du mit dem "load" Befehl in der 
.gdbinit das ELF Image geflasht.

Wenn Du den µC also via H/W Reset neu startest, dann sollte das Programm 
ja aus dem Flash los laufen.

Bei mir wird beim Flashen via GDB der Prozessor auch gleich in den Reset 
geschickt -- und bleibt dort stehen. Erst das "continue" im Debugger 
sorgt dafür, dass das Programm auch los läuft.

Warum das "continue" bei Dir nicht funktioniert, kann ich nicht sagen. 
Ich hatte hin und wieder den Fall, dass ein Neustart von OpenOCD hilft.

Evtl. gibt ja aber auch der Program Counter / Instruction Pointer einen 
Hinweis, was schief läuft: "info reg pc" im GDB, falls nicht bekannt.

von Christoph K. (chriskuku)


Lesenswert?

Danke für die Ausführungen. Sehr hilfreich mit dem nc. Ich wollte schon 
telnet nachinstallieren aber fand es in macports ohnehin nicht so 
schnell.

Philip S. schrieb:
> ...
> Warum das "continue" bei Dir nicht funktioniert, kann ich nicht sagen.
> Ich hatte hin und wieder den Fall, dass ein Neustart von OpenOCD hilft.
>
> Evtl. gibt ja aber auch der Program Counter / Instruction Pointer einen
> Hinweis, was schief läuft: "info reg pc" im GDB, falls nicht bekannt.


Tatsächlich läuft das Programm los, loopt aber an einer Stelle im 
Bereich des UART init. Das folgt jetzt in einem anderen Thread. Soweit 
hier alles erledigt.

Grüße
Christoph

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Philip S. schrieb:
> Christoph K. schrieb:
...
> Für die Optionen zum Flashen via OpenOCD siehe Beitrag #6398475 weiter
> oben:
>> echo program firmware.elf verify reset | nc localhost 4444
> [...]
>> openocd -f <Config File>.cfg -c "program firmware.elf verify reset exit"
>
> Letztere Option beißt sich aber mit dem OpenOCD Server da der Programmer
> sonst zwei mal geöffnet werden würde. Das ist eigentlich eher dann
> relevant, wenn Du keinen GDB Server brauchst oder willst.
>
>> Was aber geht, ist, wenn ich den RESET-Knopf drücke, daß dann das
>> Programm läuft und ich im picocom den Prompt sehe.
>>
>> ^C im gdb unterbricht dann.
>
> Ja, so wie ich das verstehe hast Du mit dem "load" Befehl in der
> .gdbinit das ELF Image geflasht.
>
> Wenn Du den µC also via H/W Reset neu startest, dann sollte das Programm
> ja aus dem Flash los laufen.
>
> Bei mir wird beim Flashen via GDB der Prozessor auch gleich in den Reset
> geschickt -- und bleibt dort stehen. Erst das "continue" im Debugger
> sorgt dafür, dass das Programm auch los läuft.
>
> Warum das "continue" bei Dir nicht funktioniert, kann ich nicht sagen.
> Ich hatte hin und wieder den Fall, dass ein Neustart von OpenOCD hilft.
>
> Evtl. gibt ja aber auch der Program Counter / Instruction Pointer einen
> Hinweis, was schief läuft: "info reg pc" im GDB, falls nicht bekannt.

Habe mal versucht, über das "nc" Kommando das board zu flashen und 
bekomme dieses:
1
$ echo program firmware.elf verify reset | nc localhost 4444
2
????????Open On-Chip Debugger
3
> program firmware.elf verify reset
4
Unable to match requested speed 2000 kHz, using 1800 kHz
5
Unable to set adapter speed
6
Unable to match requested speed 2000 kHz, using 1800 kHz
7
mem2array: Read @ 0xe0042004, w=4, cnt=1, failed
8
Error executing event examine-end on target stm32f4x.cpu:
9
/Users/kuku/opt/xpack-openocd-0.10.0-14/bin/..//scripts/mem_helper.tcl:6: Error: 
10
in procedure 'program' 
11
in procedure 'ocd_process_reset' 
12
in procedure 'ocd_process_reset_inner' called at file "embedded:startup.tcl", line 279
13
in procedure 'mmw' called at file "/Users/kuku/opt/xpack-openocd-0.10.0-14/bin/..//scripts/target/stm32f4x.cfg", line 79
14
in procedure 'mrw' called at file "/Users/kuku/opt/xpack-openocd-0.10.0-14/bin/..//scripts/mem_helper.tcl", line 36
15
at file "/Users/kuku/opt/xpack-openocd-0.10.0-14/bin/..//scripts/mem_helper.tcl", line 6
16
SRST error
17
embedded:startup.tcl:521: Error: ** Unable to reset target **
18
in procedure 'program' 
19
in procedure 'program_error' called at file "embedded:startup.tcl", line 558
20
at file "embedded:startup.tcl", line 521
21
> $

von Christoph K. (chriskuku)


Lesenswert?

Ich glaube, die Zeile beinhaltet eine falsche Syntax, schrieb mir jemand 
in der OpenOCD-mailing list. Ich solle das openOCD Manual im Bereich 
"program" studieren.

Du schriebst zwar, daß mit dem "load" Befehl in der .gdbinit ohnehin die 
Datei firmware.elf geflasht wird.

Das scheint aber nicht der Fall zu sein. Nach dem Start und continue
läuft wieder die Demoversion (rotating leds)

von Philip S. (phs)


Lesenswert?

Ja, so funktioniert das bei mir. Ich hab' das vor vielen Jahren initial 
aufgesetzt; seither ist das in meinen Makefiles vergraben und 
funktioniert relativ problemlos. Wie weiter oben beschrieben kannst Du 
Dir den Umweg über netcat / telnet sparen; das ganze funktioniert bei 
Bedarf auch als Einzeiler.

Kannst Du das Board eigentlich anders, z.B. mit st-link oder dem 
ST-eigenen Tool flashen? Sprich: Bist Du Dir sicher, dass die Hardware 
funktioniert?

Du schreibst ja hier von einem Nucleo F411RE; in Deinem Thread zum UART 
Problem ist die Rede vom STM32F4 Discovery Board. Bist Du Dir sicher, 
dass Du die richtigen OpenOCD Config Files für's jeweilige Board 
verwendest? Das Nucleo Board funktioniert bei mir mit 
"st_nucleo_f4.cfg"; das Discovery Board mit "stm32f4discovery.cfg".

von Christoph K. (chriskuku)


Lesenswert?

Danke. Ja, meine openOCD cfg-Datei ist stm32f4discovery.cfg.
Hauptsächliches Zielsystem ist im Moment das stm32f407G-DISC1 board, auf 
dem ich erst mal zum verifizieren der Programmierkette das mecrisp-Forth 
auf anderem UART-Port zum Laufen kriegen wollte.
Habe es gerade noch mal probiert. Ja, das mit dem load-Befehl 
funktioniert so, wie Du es beschreibst. Vielleicht ist etwas mit dem 
.elf File nicht in Ordnung. Ich hatte den .elf File vom mecrisp-forth in 
firmware.elf umbenannt. Der wird aber nicht geflasht, weshalb auch meine 
Frage aufkam.

Wie gesagt, nehme ich das Demonstration Programm STM32F4-DISC0.elf,
so flasht gdb, mit dem .elf vom mecrisp-forth nicht. Letzteres kann ich 
nur mit
1
$ st-flash erase
2
$ st-flash write mecrisp-stellaris-stm32f407.bin 0x08000000

flashen.

von Philip S. (phs)


Lesenswert?

Christoph K. schrieb:
> .elf File nicht in Ordnung. Ich hatte den .elf File vom mecrisp-forth in
> firmware.elf umbenannt.

[...]

> Wie gesagt, nehme ich das Demonstration Programm STM32F4-DISC0.elf,
> so flasht gdb, mit dem .elf vom mecrisp-forth nicht. Letzteres kann ich
> nur mit
>
>
1
> $ st-flash erase
2
> $ st-flash write mecrisp-stellaris-stm32f407.bin 0x08000000
3
>
>
> flashen.

Hast Du die Datei "mecrisp-stellaris-stm32f407.bin" nur in 
"firmware.elf" umbenannt oder explizit nach ELF gewandelt? Ist 
"mecrisp-stellaris-stm32f407.bin" wirklich ein ELF file?

Das könntest Du mit "file" prüfen. Beispiel:
1
$ file firmware.bin 
2
firmware.bin: data
3
$ file firmware.elf 
4
firmware.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped

von Christoph K. (chriskuku)


Lesenswert?

Philip S. schrieb:
> Christoph K. schrieb:
...
>> Wie gesagt, nehme ich das Demonstration Programm STM32F4-DISC0.elf,
>> so flasht gdb, mit dem .elf vom mecrisp-forth nicht. Letzteres kann ich
>> nur mit
>>
>>
1
>> $ st-flash erase
2
>> $ st-flash write mecrisp-stellaris-stm32f407.bin 0x08000000
3
>>
>>
>> flashen.
>
> Hast Du die Datei "mecrisp-stellaris-stm32f407.bin" nur in
> "firmware.elf" umbenannt oder explizit nach ELF gewandelt? Ist
> "mecrisp-stellaris-stm32f407.bin" wirklich ein ELF file?
>
> Das könntest Du mit "file" prüfen. Beispiel:
>
>
1
> $ file firmware.bin
2
> firmware.bin: data
3
> $ file firmware.elf
4
> firmware.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), 
5
> statically linked, with debug_info, not stripped
6
>

Genau das hatte ich gemacht. Auch mit dem file-Befehl noch mal explizit 
überprüft. Ich habe den .elf-file genommen, nicht den .bin file.

Der bin-file wird ja mittels objcopy aus dem elf-File generiert. Also 
dachte ich, zum Debuggen, den .elf-File nehmen zu können. Ist doch wohl 
auch der richtige Weg?

: Bearbeitet durch User
von Philip S. (phs)


Lesenswert?

Ja. Gebaut wird das ELF File. Daraus wird mit objcopy das .bin File 
generiert. Bin mir nicht sicher, ob der Weg von .bin nach ELF überhaupt 
gehen würde.

Ich bin mir auch nicht sicher, ob OpenOCD oder GDB das .bin File flashen 
können; ich nutze der Einfachheit halber immer das ELF File.

Wenn Du also wirklich das ELF File versucht hast mit GDB zu flashen und 
es weder mit GDB noch mit OpenOCD funktioniert, dann gehen mir langsam 
auch die Ideen aus.

Ein Unterschied zw. .bin und ELF File, der mir noch einfällt: Wenn Du 
das .bin File flashst, dann musst Du ja die Zieladresse explizit mit 
angeben (0x0800 0000). Beim Flashen des ELF Files muss diese Information 
ja irgendwie aus den ELF Headern kommen; man gibt sie ja sonst nirgendwo 
an. Vielleicht lohnt es sich die Adressen im ELF File anzuschauen.

von Christoph K. (chriskuku)


Lesenswert?

Philip S. schrieb:
> Ja. Gebaut wird das ELF File. Daraus wird mit objcopy das .bin File
> generiert. Bin mir nicht sicher, ob der Weg von .bin nach ELF überhaupt
> gehen würde.
>
> Ich bin mir auch nicht sicher, ob OpenOCD oder GDB das .bin File flashen
> können; ich nutze der Einfachheit halber immer das ELF File.
>
> Wenn Du also wirklich das ELF File versucht hast mit GDB zu flashen und
> es weder mit GDB noch mit OpenOCD funktioniert, dann gehen mir langsam
> auch die Ideen aus.
>
> Ein Unterschied zw. .bin und ELF File, der mir noch einfällt: Wenn Du
> das .bin File flashst, dann musst Du ja die Zieladresse explizit mit
> angeben (0x0800 0000). Beim Flashen des ELF Files muss diese Information
> ja irgendwie aus den ELF Headern kommen; man gibt sie ja sonst nirgendwo
> an. Vielleicht lohnt es sich die Adressen im ELF File anzuschauen.

Hi Philip,

danke für Deine Überlegungen. Ich bin jetzt in dem Thread "gdb 
breakpoint setzen" schlauer geworden. .bin-file hat ja gar keine 
Symbolinformation mehr. Komme jetzt ganz gut klar mit gdb und dem 
.elf-File und kann mich jetzt dem eigentlichen Problem, warum ich aus 
der USART-Schnittstelle noch nichts herausbekomme, widmen. Das Loopen in 
der Clockinitialsierung der HSEClock ist auch verschwunden. War 
vielleicht auch eine irrige Annahme auf Grund noch fehlender 
Voraussetzung, sowohl bei mir als auch beim gdb-Setup :)

Grüße
Christoph

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.