Forum: Compiler & IDEs Flashen über OpenOCD mit GDB verbinden


von Thomas M. (mth)


Lesenswert?

Hallo,

ich arbeite mit Eclipse 3.3.0 unter Windows und versuche z. Z. das 
Flashen so gut wie es geht zu automatisieren. Im Moment habe ich den 
Flashvorgang über das makefile realisiert (OCD-Server starten, flashen, 
Server beenden). Aber ich halte das nicht für eine elegante Lösung. Wenn 
das Flashen innerhalb der "all" Regel durchgeführt wird (also bei jedem 
Build), dann wird viel zu viel geflasht, selbst dann, wenn es gar nicht 
notwendig ist und der Flash-Speicher wird dadurch zu sehr beansprucht. 
Ich möchte aber auch keine eigene Regel dafür erlassen.

Für mein Arbeitsumfeld wäre es die eleganteste Lösung den Flashvorgang 
vor dem Start des Debuggers (arm-elf-gdb) voll automatisiert 
durchzuführen. Wenn hierfür jemand einen Ansatz hat, dann wäre ich sehr 
dankbar.
Man könnte das ganze dann später auch noch weiter perfektionieren, indem 
vor jedem Flashvorgang anhand des Datums des Binär-Files geprüft wird ob 
dieses neuer ist als das zuletzt geflashte Binär-File. Somit würde man 
nur noch flashen, wenn dies auch wirklich erforderlich ist.

Hier noch mal der gesamte Ablauf:

1. OpenOCD-Server starten
2. prüfen ob das Binär-File neuer ist als das zuletzt geflashte
3. wenn ja, dann flashen (entsprechendes Script dafür ist vorhanden)
4. Debugger starten
5. nach verlassen des Debugmodus den OpenOCD-Server beenden

Ich bin mir nicht sicher, ob "Debugger starten" an 4. Position so 
richtig ist, es wäre dabei zu klären, ob man vielleicht über das 
.gdbinit File als erste Aktivität den OCD-Server starten kann? Oder 
allgemein gefragt: Kann man über das .gdbinit File einen Prozess 
starten?

Ich bin für jede Hilfe dankbar und hoffe, dass wir gemeinsam eine Lösung 
erarbeiten können!

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Habe dafür zwei Debug-Konfigurationen angelegt. Eine davon mit und eine 
ohne vorheriges Flashen. Ist zwar nicht vollautomatisch, aber die 
Auswahl der Debug-Konfiguration ist nur ein Mausklick (evtl. zwei wenn 
eine andere Konfiguration vorher beendet werden muss). OpenOCD läuft 
ständig in Hintergrund.

OpenOCDs gdb-Server unterstützt den gdb load Befehl. Meine Eclipse 
"start debug mit flashen"-Konfiguration entspricht der Konfiguration 
"start debug ohne flashen" bis auf zwei zusätzliche Anweisungen in 
"Initialization Commanand" des GDB hardware debugging plugins:
monitor flash probe 0
load
wobei flash probe mglw. redundant ist und "load" gibt es auch als 
Checkbox im GDB hardware-debugging-plugin.

In der OpenOCD-Konfiguration ist gdb_flash_program enabled
eingetragen, dies ist aber wenn richtig erinnert schon per default an.

Für "manuelles Flashen" (was man eigentlich nicht mehr braucht) habe ich 
per "External Tools"-Konfiguration gelöst, die eine Batch-Datei/Shell 
Script aufruft, die wiederum per netcat mit dem Telnet-Interface des 
laufenden OpenOCD "spricht". Man braucht dann OpenOCD nicht zu beenden, 
um zwischendurch den Flash-Inhalt zu aktualisieren ohne eine 
Debug-Session zu starten.

OpenOCD Konfiguration ist natürlich vom Target abhängig, hier getestet 
mit:
- AT91SAM7SE512, Eclipse 5.x inkl. GDB hardware debug-plugin, OpenOCD 
SVN922, JTAGkey
- LPC2378, Eclipse dito, OpenOCD SVN97?

von Thomas M. (mth)


Lesenswert?

Martin Thomas wrote:
> Habe dafür zwei Debug-Konfigurationen angelegt. Eine davon mit und eine
> ohne vorheriges Flashen. Ist zwar nicht vollautomatisch, aber die
> Auswahl der Debug-Konfiguration ist nur ein Mausklick (evtl. zwei wenn
> eine andere Konfiguration vorher beendet werden muss). OpenOCD läuft
> ständig in Hintergrund.

Hab das ausprobiert, würde so funktionieren, wenn da nicht wieder ein 
kleines Problem wäre...

Ich habe schon andere Teile des Entwicklungsprozesses automatisiert und 
dabei wird bei jeder Aktivität mit dem Controller davon ausgegangen, das 
der OCD-Server erst gestartet werden muss, und danach wird er gleich 
wieder beendet, so dass jede Nachfolgeaktivität immer den gleichen 
Ausgangszustand vorfindet.

Es wäre mir auch lieber der OCD-Server würde immer laufen, aber dazu 
wäre es notwendig meinen Telnet-Client (Putty) Makros übergeben zu 
können. Ich habe das ausprobiert, es gibt da eine Kommandozeilenoption 
–m mit der man eine Befehlsdatei übergeben kann, aber die Befehle werden 
serverseitig einfach nicht ausgeführt. Das hat mich dazu gebracht den 
Server ständig neu zu starten, weil ich in der OCD Konfiguration ein 
Script zur Abarbeitung nach Neustart des Servers übergeben kann.
Ich stecke hier in einer Sackgasse und komme einfach nicht mehr 
vorwärts.

von Markus (Gast)


Lesenswert?

@MT:
Können Sie mir bitte schreiben woher ich das "GDB Hardware Debugging" 
bekommen?
Ich habe Eclipse 3.4, das kann doch sicher unter Menü "Help" >> 
"Software-Updates..." einfach installiert werden. Welchen Link tippe ich 
da ein?

Wo kann ich eigentlich eine neuere OpenOCD.exe laden?
Yagarto bietet die 717, irgend wo anders habe ich die 994 her, weiß aber 
nicht mehr wo. Im SVN ist die >=1100 schon vorhanden. Leider bin ich 
nicht im Stande die Umgebung für die SVN Version ein zu richten (Es 
scheitert schon an SVN selbst, und ...)
Es wäre toll wenn es im SVN ein Ordner "LastEXE" gäbe, von der man die 
sich einfach ziehen könnte...

PS: Auf der Seite "Accessing ARM-Controllers with OpenOCD" fehlt unter 
"Initialisation Commands:" folgender Befehle:

target remote localhost:3333

Ohne den klappt die GDB Verbindung zum OpenOCD nie. Ansonsten hat die 
Anleitung für den "NXP LPC23xx/24xx" super geklappt, nur noch die 
Anpassung an meinen JTAG-Dongle war nötig (aber das muss ja sowiso jeder 
...)
Diesen einen Link von ^^ bitte auch auf dieser Seite dokumentieren.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Markus wrote:
> @MT:
> Können Sie mir bitte schreiben woher ich das "GDB Hardware Debugging"
> bekommen?
> Ich habe Eclipse 3.4, das kann doch sicher unter Menü "Help" >>
> "Software-Updates..." einfach installiert werden. Welchen Link tippe ich
> da ein?
Link war hier nach Installation des Eclipse+CD-Pakets schon eingestellt:
http://download.eclipse.org/tools/cdt/releases/ganymede
Dann:
Software Upd. and Add-on->Available Software->CDT Opt. Feat.-> Eclipse 
GDB Hardw. Debug.

> Wo kann ich eigentlich eine neuere OpenOCD.exe laden?
Meines Wissens gibt es keine "nightly builds". Neuere manchmal von mir 
(s.u.).

> Yagarto bietet die 717, irgend wo anders habe ich die 994 her, weiß aber
> nicht mehr wo.
Mglw. von mir, ist zumindest eine der Versionen, für die ich ein 
Binärpaket bereitstelle.

> Im SVN ist die >=1100 schon vorhanden. Leider bin ich
> nicht im Stande die Umgebung für die SVN Version ein zu richten (Es
> scheitert schon an SVN selbst, und ...)
> Es wäre toll wenn es im SVN ein Ordner "LastEXE" gäbe, von der man die
> sich einfach ziehen könnte...
Ich bau mir OpenOCD f. Win32 inzwischen immer selbst. SVN-checkout 
mittels einem Linux-Rechner nebenan (gibt aber auch Win32 SVN clients), 
weiters auf einem PC unter WinxXP, MinGW/msys zum Bau der "exe", MiKTeX 
für Doku. Methode so aber kaum für ein automatisiertes "nightly-build" 
geeignet. Manchmal stelle ich das Ergebnis als 
OpenOCD_package_*_mthomas.zip auch auf 
www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects(/winarmtests) 
(derzeit SVN1131 vorhanden).

> PS: Auf der Seite "Accessing ARM-Controllers with OpenOCD" fehlt unter
> "Initialisation Commands:" folgender Befehle:
>
> target remote localhost:3333
Ergänzt. Danke.

> Ohne den klappt die GDB Verbindung zum OpenOCD nie. Ansonsten hat die
> Anleitung für den "NXP LPC23xx/24xx" super geklappt, nur noch die
> Anpassung an meinen JTAG-Dongle war nötig (aber das muss ja sowiso jeder
> ...)
> Diesen einen Link von ^^ bitte auch auf dieser Seite dokumentieren.
Getan.

OpenOCD ist aber derart im Fluß, dass man kaum hinterherkommt. Meine 
Anleitungen auf der o.g. Seite sind schon veraltet oder werden schnell 
veralten (steht auch im "Vorwort"). Bin dazu übergegangen, in jedem 
Projekt ein extra Unterverzeichnis mit dem verwendeten OpenOCD anzulegen 
als "feature freeze".

von Markus (Gast)


Lesenswert?

@MT:
Vielen Dank für die Ausführliche Antwort!
(Und auch Ihr sehr aktives Zutun für die ARM Freunde... Diese Seiten 
haben mir sehr geholfen)

Genau so einen Link hab ich gesucht, wo alle 2-4 Wochen ein neues 
OpenOCD zu finden ist, vielen Dank!

> OpenOCD ist aber derart im Fluß
nicht nur OpenOCD, auch Eclipse, Compiller, debugger usw.

Ich habe mir ein "arm-elf", "arm-none-eabi", OpenOCD, Eclipse, Demos 
usw. Paket zusammengabaut, das ich ohne Probleme (nur PATH-Variable) 
kopieren kann. (ca. 700MB / 19000Files). Bis das lief (neuanfänger) 
brauchte ich sicher 2 Monate beschäftigt...
Jetzt kann ich ARM7 und Cortex problemlos kompillieren, nur mit dem 
LPC2368/Olimex JTAG hatte ich noch Probleme. Aktuelle Probleme habe ich 
noch mit der SWD-Schnittstelle des Cortex. Irgendwie funktioniert der 
Cortex nur mit der JTAG. Haben Sie schon Erfahrung mit dem SWD 
Interface?
Ich habe auch einen SEGGER JLink (V6) aber der funktioniert viel 
schlechter als der Olimex ARM-USB-OCD, daher liegt der nur rum. (Kaum 
Unterstützung von Segger)
Wenn ich SWD noch zum laufen bekommen würde ist die Entwicklungsumgebung 
perfekt.

von Lorenz .. (lorenz)


Lesenswert?

@ Martin Thomas:
Danke für DIESEN Link, nach prebuild Binaries habe ich schon öfters 
erfolglos gesucht!

von Martin L. (Gast)


Lesenswert?

Es gibt das monitor Kommando vom GDB. "monitor flash ..." führt also 
"flash ..." in openocd aus. Das kann man sich dann in die .gdbinit (oder 
wie sie genau heisen mag) hineinschreiben.

Viele Grüße,
 Martin Laabs

von Gast (Gast)


Lesenswert?

Wobei das flashen so nur mit von OpenOCD unterstützten Chips 
funktioniert.
Ich flashe meine ADUC7000, in dem ich zu erst per REgister flashen 
erlaube
und dann die Daten direkt reinlade.

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.