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
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.
Am einfachsten geht das tatsächlich mit dem Studio. Das 4er reicht dafür allemal aus. Oliver
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
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
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?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.