Forum: Compiler & IDEs Takte zählen (im Debugger)


von Le X. (lex_91)


Lesenswert?

Hallo,

kurze Frage: ich debugge mein Projekt mit simulavr als Debugserver und 
avr-gdb als Debugger (aus Eclipse heraus).
Später wird avarice anstatt simulavr verwendet um direkt die Hardware zu 
debuggen.

Gibt es eine Möglichkiet, die Takte zwischen zwei Codezeilen anzeigen zu 
lassen, z.B. um die Laufzeit einer Funktion zu messen?

Google spuckt bisl was mit Cyclecounter aus, bin mir aber nicht sicher 
ob es dieses Feature nur in AVR-Studio gibt.

Viele Grüße,
lex

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Simulavr sollte sowas haben, allerdings ist mir gerade nicht ganz klar,
wie man es benutzt.  Im Prinzip sollte es in der Doku stehen …

AVaRICE (bzw. die JTAG ICEs) hat sowas nicht.

Bislang habe ich mir, wenn ich sowas gebraucht habe, mit Hardware-
Timern geholfen: vor dem zu messenden Abschnitt wird ein Timer
initialisiert mit einem sinnvollen Prescalerwert.  Nach dem
Abschnitt wird er wieder angehalten.  Entweder liest man dann die
Timerregister live aus und rechnet es sich mit dem Taschenrechner
um in Zeiten, oder (wenn der Flash genügend Reserve hat) man lässt
es gleich den AVR in Mikrosekunden umrechnen, die man dann in einer
volatile-Variablen ablegt.  Von da aus kann man sie sich mit dem
GDB wieder auslesen.  Alternativ (wenn man schon eine Ausgabefunktion
hat) kann man sich die Zeiten natürlich auch gleich dumpen lassen.

von Oliver (Gast)


Lesenswert?

Am einfachsten geht das tatsächlich mit dem Studio. Das 4er reicht dafür 
allemal aus.

Oliver

von Le X. (lex_91)


Lesenswert?

Danke euch erstmal.

Die -t Option aktiviert anscheinend die Trace-Funktion, dadurch wird 
während der Simulation eine Log-Datei geschrieben.
Diese sollte, laut http://www.nongnu.org/simulavr/usage.html in der 
ersten Spalte die aktuelle Zeit in ns enthälten.

Meine Log-Datei beginnt allerdings gleich mit der file-Spalte, die für 
mich interessante Spalte fehlt komplett.

WinAvr enthält allerdings die nicht mehr aktuelle Version 0.9 von 
simulavr.
Ich hab mir also auf der Projektseite die letzte Releaseversion (1.0) 
gesucht.

Diese zeigt leider das Selbe Verhalten.
Laut Doku sollte dort eine Zeitangabe auftauchen, tut sie aber nicht :/

Trotzdem ist der Trace nicht uninteressant, da ich sofort sehe was in 
einer Funktion wirklich wieoft ausgeführt wird.
Eine Zeitangabe würde aber das Ganze nochmal deutlich angenehmer machen.

Viele Grüße,
lex

von Le X. (lex_91)


Lesenswert?

So,
ich hab jetzt bisl die Sourcen der aktuellen Version studiert und komme 
zu dem Schluß, dass das Loggen der Zeit momentan nicht implementiert 
ist...

Fragt sich nur, wieso es in der Doku erwähnt und sogar auf einem 
Screenshot zu sehen ist :/

Lebt das Projekt eigentlich noch?

Viele Grüße,
lex

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

le x. schrieb:

> Fragt sich nur, wieso es in der Doku erwähnt und sogar auf einem
> Screenshot zu sehen ist :/

Das bezieht sich dann vermutlich auf die Vorgängerversion (0.1.2.*),
und es hat einfach nie jemand die Doku auf der Webseite aktualisiert.
:-/

> Lebt das Projekt eigentlich noch?

Ja, an sich schon.  Allerdings ist die aktuelle Version (also das,
was mal mit 0.9 begonnen hat und jetzt 1.x ist) ein kompletter
Rewrite des Codes, der featuremäßig halt nicht völlig kompatibel
zur alten Codebasis ist.

Prinzipiell sollte man sowas doch aber noch einbringen können in
den Sourcecode, oder?

von Le X. (lex_91)


Lesenswert?

Ich hab mir den Mechanismus angeschaut. Grundsätzlich sollte sowas nicht 
weiter schwer sein.
Der simulavr ist schon so nett und teilt Befehle mit mehreren Takten 
auch auf mehrere Zeilen im Trace auf (mit der Bemerkung CPU_WAITSTAE).
D.h. grundsätzlich bräuchte man nur noch die Taktfrequenz um daraus für 
jeden Befehl die aktuelle Zeit seit Starten der Simulation zu errechnen.

Vielleicht gibt es irgendwelche Fälle, wo das Ganze nicht mehr so funkt 
(zB Interrupts).

Mein Entwicklungs(Linux)-Rechner ist leider noch nicht mit umgezogen, 
sonst würd ich da gleich mal was ausprobieren. Hier hab nur eine 
Windowskiste ohne make-Umgebung, da tu ich mir das nicht an :-)

Viele Grüße,
lex

von Oliver (Gast)


Lesenswert?

le x. schrieb:
> Hier hab nur eine
> Windowskiste

Auf die Gefahr hin, mich zu wiederholen: AVRStudio..
Manmuß das ja nicht lieben, aber wenn es dein Problem löstm warum nicht.

Wenn du allerdings Zyklen pro C-Zeile zählen willst, ist das eh ein 
Ratespiel. Sinnvoll ist das ja nur mir eingeschalteter Optimierung, und 
da ist die Zuordnung von erzeugtem Assmeblercode zu C-Sourcen beim 
avr-gcc leider etwas, nun ja, wirr ;) Für ganze Funktionen passt es 
einigermaßen...

Oliver

von Le X. (lex_91)


Lesenswert?

Das Studio nicht mögen ist das eine...
Ich kanns auf meiner "richtigen" Kiste einfach nicht benutzen, zumindest 
nicht ohne weiteres.

>um die Laufzeit einer Funktion zu messen

Genau das will ich machen.
Und das geht sogar momentan schon sehr sehr gut mit dem Trace aus dem 
Simulator. Eben weil ich nur schaun muss: über wieviele Zeilen in der 
Log-Datei erstreckt sich der Funktionsaufruf. Die Anzahl an Zeilen 
entspricht der Anzahl der Takte (ohne CALL-Befehl natürlich). Da wird ja 
auch nichts geraten.

Vielleicht hier mal ein kurzer Schnipssel aus so einem Trace.
>test.elf 0x0110: main+0x17                      CALL 0xde SP=0x45b 0x8a >SP=0x45a 
>0x0
>test.elf 0x0110: main+0x17                      CPU-waitstate
>test.elf 0x0110: main+0x17                      CPU-waitstate
>test.elf 0x0110: main+0x17                      CPU-waitstate
>test.elf 0x00de: test_4                         SBI 0x1a, 4
>test.elf 0x00de: test_4                         CPU-waitstate
>test.elf 0x00e0: test_4+0x1                     RET SP=0x45b 0x0 SP=0x45c >0x8a
>test.elf 0x00e0: test_4+0x1                     CPU-waitstate
>test.elf 0x00e0: test_4+0x1                     CPU-waitstate
>test.elf 0x00e0: test_4+0x1                     CPU-waitstate
>test.elf 0x0114: main+0x19                      POP R17 SP=0x45d 0x0

Die tatsächliche Laufzeit (in Nanosekunden) wär halt noch so ein 
i-Tüpfelchen, nice-to-have.
Da es in der Doku erwähnt wird hab ich eben in diese Richtung 
weitergefragt.

Aber so wies jetzt ist tuts eigentlich auch das was ich will.

Viele Grüße,
lex

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.