Forum: Mikrocontroller und Digitale Elektronik µC - Debugger "live"


von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Hallo liebe Gemeinde,

gestern habe ich zum allerersten Mal einen µC programmiert (für das, was 
ich einprogrammiert habe, braucht man eigentlich keinen µC ;) ), bin 
also recht frisch auf dem Gebiet.

Ist es in der IDE möglich im Debuggerbetrieb den Status eines normalen 
Inputpins "live" abzufragen? Ausprobiert habe ich folgendes: Debugger 
starten, "Run to Cursor" -> Pin ist 0. Jetzt Schalter betätigen, "Run to 
Cursor" -> Pin ist auf 1. Gibt es die Möglichkeit diesen Ablauf zu 
automatisieren? Der Pin wird in einer Schleife abgefragt. Ich möchte 
lediglich am PC erfahren, ob der Schalter betätigt ist oder nicht, ohne 
dabei jedes Mal auf "Run to Cursor" zu klicken.

Danke für eure Hilfe!

Grüße
Reggie


Achso, die Hard- und Software:
- STM32F4 Discovery MB997 C-01
- Rowley CrossStudio for ARM 3.5 (Cross Workbench)

von m.n. (Gast)


Lesenswert?

Nicht, daß ich Dich hier mit meinen 'eigenartigen' Vorschlägen zutexten 
möchte, aber diese Eigenschaft bieten Keil und IAR, soweit mir bekannt 
ist. Bei IAR heißt die Funktion 'live watch' und ist eine sehr feine 
Sache. Gerade um einen neuen µC kennenzulernen, kann ich es nur 
empfehlen.
Mit dem IAR-Kickstart sind 32 kB Code kostenlos möglich. Das reicht für 
Deine Belange voll aus.

Darüber hinaus ist IAR aber 'böse', da sehr hochpreisig. Darum findest 
Du hier nur spärliche Hilfestellung.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

m.n. schrieb:
> 'eigenartigen' Vorschlägen

Ohne Worte^^


m.n. schrieb:
> Bei IAR heißt die Funktion 'live watch' und ist eine sehr feine
> Sache.

Ah OK, vielleicht weiß ja jemand anders noch ob es das bei CrossStudio 
auch gibt. Ich google auf jeden Fall mal weiter.


m.n. schrieb:
> Darüber hinaus ist IAR aber 'böse', da sehr hochpreisig. Darum findest
> Du hier nur spärliche Hilfestellung.

Joar, ich hab ein nettes "Studenten"-Angebot von denen bekommen. 
Allerdings frage ich mich, wieviele Studenten Millionäre sind -.-


Danke trotzdem.

von Bernd K. (prof7bit)


Lesenswert?

Geht auch mit segger jlink edu, nennt sich dort JScope.  Der edu  kostet 
50 EUR und ist jeden Pfennig davon wert, und noch viel mehr.

Wenn Deine IDE mit dem Jlink umgehen kann (sehr wahrscheinlich) dann 
kauf ihn Dir.

von Guest (Gast)


Lesenswert?

Bernd K. schrieb:
> Wenn Deine IDE mit dem Jlink umgehen kann (sehr wahrscheinlich) dann
> kauf ihn Dir.

Klar, kann CrossWorks mit dem J-Link umgehen.
Oder einfach direkt SES nehmen ;-), 
https://segger.com/embedded-studio.html

von Steffen R. (steffen_rose)


Lesenswert?

Wird bestimmt auch mit dem ST-Link des Discoveryboards gehen.

Schau mal im Watchfenster nach.
Zum einen müßtest Du hier eintragen, was du sehen willst. Beim normalen 
debuggen solltest du definitiv die Veränderung sehen.

Dann gibt es im Watchfenster eine "Zeit" Einstellung. Statt 'Never' mal 
'each second' ausprobieren.

Ich nutze es selbst nicht. Aber vielleicht klappts.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Steffen R. schrieb:
> Wird bestimmt auch mit dem ST-Link des Discoveryboards gehen.
>
> Schau mal im Watchfenster nach.
> Zum einen müßtest Du hier eintragen, was du sehen willst. Beim normalen
> debuggen solltest du definitiv die Veränderung sehen.
>
> Dann gibt es im Watchfenster eine "Zeit" Einstellung. Statt 'Never' mal
> 'each second' ausprobieren.
>
> Ich nutze es selbst nicht. Aber vielleicht klappts.

Klar wird das gehen, die Frage ist nur ob und wie bei CrossWorks :)
Sprichst du jetzt von CrossWorks? Ich sehe da kein "Watch Fenster" (vllt 
bin ich auch einfach nur blind).

von Steffen R. (steffen_rose)


Lesenswert?

Reginald L. schrieb:
> Klar wird das gehen, die Frage ist nur ob und wie bei CrossWorks :)

Meine Idee habe ich beschrieben.

> Sprichst du jetzt von CrossWorks?

ja
konkret: Crossworks for ARM 3.3 für Windows
Die Fenster sollten aber in anderen Versionen/OS gleich sein.

> Ich sehe da kein "Watch Fenster" (vllt
> bin ich auch einfach nur blind).

Die Menüstruktur könnte von der Version abhängen.
Debug->Other Windows->Watch->Watch1

Möglicherweise ist es schon offen. Dann such nach einem Symbol (Viereck 
mit Brille). Unter Windows haben sie statt der üblichen Tabs Symbole zum 
umschalten der Fenster.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Aaaaah ja jetzt, habs, danke. Wenn ich ihm hier aber beispielsweise 
"GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)" reinschmeiße, geht nix mehr. 
Was hab ich jetzt wieder verbockt :)

von Steffen R. (steffen_rose)


Lesenswert?

Das Watchfenster ist zum Beobachten von Variablen.
Funktionen kann man da nicht ausführen.

D.h. Du must im Programm den Wert des Pins einer Variablen zuweisen und 
diese dann beobachten.

Wie hast Du in deinem Eingangspost gesehen, dass dein Pin 0 oder 1 ist?

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

In meinem Code ist der, oben genannten, Funktion die Variable "PA0" 
zugewiesen. Wenn ich auf "Build and Debug" gehe, ist der Code ja 
pausiert. Die Variable "PA0" habe ich dann in das "Memory" Fenster 
übergeben ("Locate Memory"). Dort sehe ich dann ob der Pin 1 oder 0 ist. 
Aber eben nur, wenn ich "Run to Cursor" klicke. Wenn ich stattdessen den 
Code laufen lasse (mit "Continue", großer grüner Button), aktualisiert 
er das Fenster "Memory" nicht mehr und im Watch Fenster steht "PA0 
symbol not found".

Und wieder hab ich was verbockt :)

von Bernd K. (prof7bit)


Lesenswert?

Reginald L. schrieb:
> Wenn ich stattdessen den
> Code laufen lasse (mit "Continue", großer grüner Button), aktualisiert
> er das Fenster "Memory" nicht mehr

Das "normale" Debuggen geht alles über den GDB (oder vergleichbare 
Debugger), der macht das während der µC angehalten ist. Das Auslesen von 
Speicher ohne den µC anzuhalten erfordert einerseits das Vorhandensein 
gewisser Hardware im µC die das überhaupt erst möglich macht (z.B. Core 
Sight®™, ist zum Glück in jedem ARM-Cortex enthalten) und andererseits 
die Unterstützung selbigens auf Seiten des Debuggers (GDB kann das AFAIK 
(noch) nicht) und womöglich (weiss nicht genau) muss das auch noch bei 
der Konstruktion des JTAG-Adapters oder dessen Firmware berücksichtigt 
werden.

In Deinem Fall hast Du einen STM32 (der kann das) und auf dem Demo-Board 
einen On-Board JTAG-Adapter (STLinkv2.1, kann der das auch? Vielleicht.) 
und auf dem PC ist GDB als Debugger (der kann das nicht).

DU musst also mindestens auf PC-Softwareseite (IDE, Debugger) was haben 
das das unterstützt. Die IMHO momentan mit Abstand kostengünstigste 
und universellst verwendbare Lösung (die mit jedem Cortex unter dieser 
Sonne und mit jeder IDE und sogar unter Linux reibungslos funktioniert) 
wäre also:

* Klemm den integrierten ST-Link am Discovery-Board ab (Jumper?)
* Schliesse einen J-Link an die JTAG- (oder SWD-) Schnittstelle an
* Konfiguriere Deine IDE entsprechend
* Verwende Deine IDE für die üblichen Dinge wie gewohnt
* Verwende die Segger-Software für die Spezialfunktionen (J-Scope live 
trace)

Wenn Du Glück hast findest Du manchmal Demo-Boards von (anderen) 
Herstellern die ohne zusätzliche Hardware mit der Segger Software 
kompatibel sind, dann musst Du Dir nichtmal einen J-Link kaufen. Ein 
Beispiel sind zum Beispiel die FRDM-Boards von Freescale (Kinetis MKLxx 
µC), da kann man auf den dortigen on-board Adapter eine alternative 
Firmware (offiziell von Segger) draufladen und dann verhält sich das 
Ding exakt so wie ein vollwertiger J-Link und die ganze Segger-Software 
(kostenlos) inklusive J-Scope funktioniert damit. Dann hast Du für 15$ 
ein komplettes System und kannst sofort loslegen.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Puh, ganz schön starker Tobak. Das muss ich mir erst einmal zu Gemüte 
führen.

Vielen lieben Dank für die ausführliche Erklärung!

von m.n. (Gast)


Lesenswert?

Bernd K. schrieb:
> * Klemm den integrierten ST-Link am Discovery-Board ab (Jumper?)

Wozu das denn?
IAR liefert die 'live watch' Funktion über ST-Link, sodaß an der 
Grundbeschaltung garnichts geändert werden muß. Man muß es einfach nur 
machen ...

von Bernd K. (prof7bit)


Lesenswert?

Reginald L. schrieb:
> Puh, ganz schön starker Tobak. Das muss ich mir erst einmal zu
> Gemüte
> führen.
>
> Vielen lieben Dank für die ausführliche Erklärung!

Es gibt noch ne einfachere Variante die ich gerne verwende:

Parallel zu der Firmware für das Device das ich entwickle schreib ich 
mir auch gleich eine kleine ganz spezielle simpel(!) gestrickte 
PC-Software die zum Beispiel Daten von der Seriellen entgegen nimmt und 
in geeigneter Weise anzeigt und manchmal auch in der Lage ist etwas 
zurückzuschicken so daß Du sogar damit interagieren kannst.

Zum Beispiel hab ich momentan was in der Mache das alle 0.25 Sekunden 3 
Messwerte und einen binären Zustand von meiner Schaltung über die 
serielle Schnittstelle entgegen nimmt und hübsch plottet und anzeigt 
(und als csv speichert) und gleichzeitig erlaubt mit 2 Schiebereglern 
mit der Maus 2 Werte zu ändern und über die UART zurückschickt um das 
ganze Ding in Echtzeit interaktiv zu parametrieren.

Im einfachsten Fall fängst Du damit an einfach nur die fraglichen Daten 
an der UART auszugeben und die am PC mit einem fertigen Terminalprogramm 
oder dergleichen anzuzeigen oder mitzuschreiben, das hilft schon sehr 
viel und das geht sogar meist schon dann wenn aus irgenwelchen Gründen 
überhaupt kein Debugger vorhanden ist oder angeschlossen werden kann.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Bernd K. schrieb:
> Parallel zu der Firmware für das Device das ich entwickle schreib ich
> mir auch gleich eine kleine ganz spezielle simpel(!) gestrickte
> PC-Software die zum Beispiel Daten von der Seriellen entgegen nimmt und
> in geeigneter Weise anzeigt und manchmal auch in der Lage ist etwas
> zurückzuschicken so daß Du sogar damit interagieren kannst.

Das habe ich mir auch schon überlegt. Ich hab schon Probleme damit, den 
richtigen Zeichensatz mit USB VCP zu verschicken ;) Wie gesagt, C und µC 
ist ganz neu für mich. Habe bisher nur mit MatLab programmiert.

von Steffen R. (steffen_rose)


Lesenswert?

Reginald L. schrieb:
> Die Variable "PA0" habe ich dann in das "Memory" Fenster
> übergeben ("Locate Memory").

Das ist der umständlichste Weg, den du nehmen konntest.

Zum Ansehen von Variablen sind
- Watch View
- Autos
- Globals
- Locals
usw. gedacht. Je nachdem, welcher Art die variablen sind die du sehen 
willst.


Thema J-Link:
Ja, die Teile sind gut. Doch bevor du nun anfängst dir Dinge zu kaufen, 
solltest Du schauen, was dir das vorhandene Equipment bietet.
Damit meine ich noch nicht einmal so sehr das ST-Link. Sondern eher die 
IDE. Ohne dieses Wissen wirst du auch mit dem J-Link nicht glücklich.

JScope habe ich bisher nicht genutzt. Den meisten mir bekannten 
Zusatztools ist jedoch gemeinsam, dass man diese nicht gleichzeitig mit 
dem Debugger nutzen kann. Ist normalerweise auch nicht Sinn der Sachen. 
Mann will ja entweder Debuggen oder frei Laufen lassen.

Reginald L. schrieb:
> gestern habe ich zum allerersten Mal einen µC programmiert

Arbeite Dich erstmal in die "einfachen" Dinge ein.

Bernd K. schrieb:
> Das Auslesen von
> Speicher ohne den µC anzuhalten erfordert einerseits das Vorhandensein
> gewisser Hardware im µC die das überhaupt erst möglich macht
> [...]

Ich hatte auch schon Systeme, das wird das System für einen kurzen 
Augenblick angehalten, während die Variablen ausgelesen werden. Dumm, 
wenn dabei auch der Takt der Peripherie mit anhält.

Wenn man es weiß, kann man häufig auch was dagegen tun. Aber hierfür muß 
kan wissen, wie das jeweilige System diese Funktionalität umsetzt. Daher 
auch meine obige Aussage, dass es nicht zu den einfachen Dingen gehört.

Aber um dir die "Angst" zu nehmen. Die Cortex-M sind mit ihrer SWD 
Schnittstelle super zum Live-View geeignet.

von m.n. (Gast)


Lesenswert?

Steffen R. schrieb:
> Aber um dir die "Angst" zu nehmen. Die Cortex-M sind mit ihrer SWD
> Schnittstelle super zum Live-View geeignet.

So ist es! Damit kann man die Software bestens im Zielsystem entwickeln.

von Bernd K. (prof7bit)


Lesenswert?

Steffen R. schrieb:
> JScope habe ich bisher nicht genutzt. Den meisten mir bekannten
> Zusatztools ist jedoch gemeinsam, dass man diese nicht gleichzeitig mit
> dem Debugger nutzen kann

Stört sich nicht gegenseitig. Als Debugger nutze ich den JLink 
GDB-server unter Eclipse-GNU-ARM und JScope läuft als separate 
Anwendung. Ich kann während J-Scope noch läuft nach herzenslust debuggen 
oder auch laufenlassen, die Debug-Session abbrechen und eine neue 
Session mit einem neuen Binary beginnen und sofern sich das Layout der 
globalen Variablen nicht geändert hat läuft JScope nehebher einfach so 
weiter. Über den selben Adapter. Gleichzeitig.

Nur die Benutzeroberfläche von JScope selbst ist noch etwas lieblos und 
gedankenlos zusammengestoppelt, unvollständig und bei intensivem 
Gebrauch etwas nervtötend (vielleicht gibt sich ja noch irgendwann) aber 
es erfüllt den Zweck aus technischer Hinsicht 1a.

Und übrigens der Clou daran ist ja gerade dass eben entgegen Deiner 
Vermutung (kurz anhalten) tatsächlich nichts angehalten wird, kein 
einziger Taktzyklus geht verloren, es wird wirklich dank entsprechender 
Hardwareunterstützung im ARM-Cortex parallel zur Ausführung auf den 
Speicher zugegriffen (beim EDU 50 mal pro Sekunde und bei den teuren 
über 1000 mal) vollkommen ohne irgendwelche Wechselwirkungen und 
Seiteneffekte.

Aber wie gesagt, auch die uralte Kulturtechnik des printf-debugging 
(entsprechend bei controllern dann eben UART-Debugging) sollte man sich 
aneignen und pflegen, damit kommt man oft schon sehr weit wenn mal aus 
irgendwelchen Gründen gar kein Debugger zur Verfügung steht (z.B. Zu 
debuggendes Gerät ist irgendwo eingebaut, nur noch die 
Bootloader-Schnittstelle ist zugänglich, etc).

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

So,
nachdem ich heute den ganzen Tag damit verbrauchte habe, mein PC-System 
komplett neu aufzusetzen (neuen Mainboard), bin ich jetzt wieder im 
Reich der Bits und Bytes :)

Leider habe ich die eMail mit dem Code für den "Probiermonat" von 
Crossworks gelöscht, bin gerade also dabei in CooCox einzusteigen. Mal 
schauen wie sich das in ein paar Tagen macht. Kaufen möchte ich mir 
Crossworks noch nicht, erst muss ich schauen was mir am besten zusagt.

Zum Debuggen: Blicke da nicht so ganz durch, mit JScope, Autos und und 
und. Die Möglichkeit mit printf funktioniert in CooCox? Wird mir das in 
einem extra Fenster ausgegeben?

von Steffen R. (steffen_rose)


Lesenswert?

> Leider habe ich die eMail mit dem Code für den "Probiermonat" von
> Crossworks gelöscht, bin gerade also dabei in CooCox einzusteigen. Mal
> schauen wie sich das in ein paar Tagen macht. Kaufen möchte ich mir
> Crossworks noch nicht, erst muss ich schauen was mir am besten zusagt.

Zwischen CooCox und Crossworks liegen Welten.
CooCox ist vermutlich besser für Einsteiger geeignet. Bietet aber auch 
viel weniger Einstellmöglichkeiten.

> Zum Debuggen: Blicke da nicht so ganz durch, mit JScope, Autos und und
> und.

Autos -> lokale Variable

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Und weiter gehts:

Mit Coocox kam ich gar nicht klar, habs nicht mal hinbekommen, den "Test 
Build" zu starten. Habe die BetaV2 benutzt. Glücklicherweise, habe ich 
nochmal einen Evaluationscode von Crossworks bekommen :> so bin ich 
erstmal wieder hier.

Mit der Terminalausgabe komme ich absolut nicht klar, der Guide von 
CrossWorks funktioniert bei mir nicht (was wohl eher an mir liegt :) ).

Habe auch schon wieder ein neues (Verständnis-) Problem, habe dazu einen 
neuen Thread eröffnet.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Bin jetzt wieder erstmal zur EMBlocks IDE gesprungen, da ich Probleme 
mit IRQs habe und dort schon eine dementsprechende Startup-File 
vorhanden ist.

Ich habe es auch endlich geschafft, mit printf zu debuggen, aller Anfang 
ist schwer :P

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.