www.mikrocontroller.net

Forum: Compiler & IDEs Wie macht man einen Einzelschritt im Simulator?


Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, wie macht man im Simulator denn einen "Einzelschritt", also ohne 
dem Code gleich in die Eingeweide zu schauen?

Beispiel (sinnlos, aber nur für's Prinzip)

  _delay_ms(10);
  _delay_ms(10);
  _delay_ms(10);

Der gelbe Pfeil steht auf der ersten der 3 Zeilen, und ich möchte nur 
wissen, wieviele prozessor clocks nach der ersten Zeile vergangen sind. 
Also wie komme ich mit einer Taste zur zweiten Zeite, ohne daß ich in 
die Implementierung von _delay_ms einsteige und ohne alles mit 
Breakpoints zupflastern zu müssen..? Wahrscheinlich bin ich nur zu 
blind... :-)

Optimierung hab ich ausgeschaltet..

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
F10  Einzelschritt, ohne in eine Funktion einzusteigen
F11  Einzelschritt, wobei bei einem Funktionsaufruf in die Funktion 
hineingesteppt wird.

Autor: PillePalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Step over , Step out usw.usw.

RTFM ...

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das komplette "Programm"

#include <util/delay.h>

void main()
{
  _delay_ms(10);
  _delay_ms(10);
  _delay_ms(10);
}


Ich drücke Start -> gelber Pfeil steht auf dem Funktiosanfang "{"

Was muß ich nun drücken, damit der gelbe Pfeil nacheinander diese 3 
Zeilen hinunterwandert (und nur diese) ? Mit F10 finde ich mich in der 
delay.h wieder, was ich gerade nicht will...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PillePalle wrote:
> Step over , Step out usw.usw.
>
> RTFM ...

... oder zumindest die Namen der Menüeinträge im Debug-Menü  :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CAnfänger wrote:
> Also das komplette "Programm"
>
> #include <util/delay.h>
>
> void main()
> {
>   _delay_ms(10);
>   _delay_ms(10);
>   _delay_ms(10);
> }
>
>
> Ich drücke Start -> gelber Pfeil steht auf dem Funktiosanfang "{"
>
> Was muß ich nun drücken, damit der gelbe Pfeil nacheinander diese 3
> Zeilen hinunterwandert (und nur diese) ? Mit F10 finde ich mich in der
> delay.h wieder, was ich gerade nicht will...


1) stimmen die Zeiten sowieso nicht
2) macht ein delay in einer Debug-Sitzung nicht wirklich Sinn. Der 
Programmierer hat einen viel größeren delay.
3) Die delay Funktion sind generell oftmals ein Zeichen für den falschen 
Programmieransatz.
4) Der Compiler wird die delay Funktionen inlinen.
5) In die Zeile nach dem delay einen Breakpoint setzen und das Programm 
dorthin laufen lassen.
6) Hab jetzt gerade kein AVR-Studio bei der Hand. Wenn ich mich recht 
erinnere, gibt es auch einen Menüpunkt 'Run to this line' oder so 
ähnlich. Wie gesagt: Einfach mal das Angebot im Debug-Menü studieren.

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor Ihr hier über den nicht vorhandenen Sinn diskutiert (den ich oben 
erklärt habe) -

Könnte das bitte jemand mal kurz selbst wirklich ausprobieren? Ich habe 
die Anleitung gelesen. Ich will weder ein- noch aus-"steppen", sondern 
in der gleichen Ebene bleiben... F10 tut das bei mir nicht.

Sorry aber bis jetzt gab es das in jedem Debugger, den ich benutzt 
habe.. :-) Ich stell mich doof an..

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also schön, ein bischen mehr Quelltext, damit es "sinnvoller" erscheint. 
:-) Was mir aufgefallen ist: Ich kann auf die Zeile PORTB=0x11; keinen 
Breakpoint setzen - sobald ich das ganze laufen lasse, erhalte ich:

Debugger: 'Break at line my1Project.c:100' has been disabled. Unable to 
bind line 100 in file "my1Project.c" to a program memory address.

Auffällig: der Debugger verwendet eine .elf-Datei, die gar nicht zu 
meinem Projekt gehört.. Compiliert wird aber die richtige Datei.. Wo 
stellt man denn das nun wieder ein, welche .elf-datei er nimmt?



#include <util/delay.h>
#include <avr/io.h>

int main()
{
  _delay_ms(10);
  PORTB=0x11;
  _delay_ms(10);
  PORTB=0x22;
  _delay_ms(10);
  PORTB=0x11;
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CAnfänger wrote:

> Auffällig: der Debugger verwendet eine .elf-Datei, die gar nicht zu
> meinem Projekt gehört.. Compiliert wird aber die richtige Datei.. Wo
> stellt man denn das nun wieder ein, welche .elf-datei er nimmt?

Was soll er sonst nehmen? Irgendeine der Ausgabedateien muss es schon 
sein. Da bleiben (beim modernen Debugger in AVR-Studio (meinst du den 
mit "Debugger" oder meinst du einen anderen Debugger, gdb?, vmlab?)) 
exakt die ELF-Datei oder die HEX-Datei, die aus der ELF-Datei erzeugt 
wurde. Und vergleiche mal den Namen der ELF Datei mit deinem 
Projektnamen oder mit dem Target in dem Makefile.

Autor: CAnfänger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine den Debugger vom AVR Studio (nicht den Debugger2). Ich glaube 
dieses neue "AVR Studio" hat irgendwie ne Macke.. Oder wieso gibt es bei 
mir angeblich dasselbe Windows-Fenster mit Nummer 1 aber 2 verschiedenen 
Dateien, wobei ich auch nicht umschalten kann? (siehe Bild)...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diesen Effekt kenne ich nicht. Ich benutze ein älteres AVR-Studio

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, neu gestartet, jetzt hab ich zumindest dasselbe Fenster Nummer 1 
zweimal.. Ich kann jetzt auch einen Breakpoint auf diese Zeile setzen:

  PORTB=0x11;

aber egal wie ich weitergehe, F10 oder F11, ich steige immer in die 
delay.h ein...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die BPs auf den PORTx Zeilen wieder funktionieren, gibt es eine 
pragmatische Lösung: Setze BPs auf die PORTx Zeilen und lasse das 
Programm dann frei laufen (F5)

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich wollte es eben gerne ohne solche Krücken schaffen..

@Karl heinz: Punkt 4) wieso soll der Compiler das "inlinen" wenn ich die 
Optimierung aus habe?



Wäre wirklich nett, wenn es jemand mit einem AVR Studio testen könnte, 
ich zweifel schon arg an mir inzwischen...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CAnfänger wrote:
> Naja, ich wollte es eben gerne ohne solche Krücken schaffen..

Beim schaffen wäre mir das egal ;-)

> @Karl heinz: Punkt 4) wieso soll der Compiler das "inlinen" wenn ich die
> Optimierung aus habe?

Weil die Funktion mit dem Schlüsselwort inline dekoriert ist?

> Wäre wirklich nett, wenn es jemand mit einem AVR Studio testen könnte,
> ich zweifel schon arg an mir inzwischen...

Bei mir ginge das erst heute abend, mit einer älteren (4.12 oder 4.13) 
Version des AVR-Studios

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, es eilt ja nicht, aber ein Test wäre nett. Vielleicht geht es ja 
auch einfach nicht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Weil die Funktion mit dem Schlüsselwort inline dekoriert ist?
Das lassen wir uns mal gaaanz langsam auf der Zunge zergehen ;-)

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe etwas weiterprobiert.. der ganze Rest meines Quelltextes (das 
oben ist ja nur ein Beispiel) läßt sich wie gewünscht mit F10 und F11 
debuggen, und da funktioniert es auch wie erwartet und ohne daß man 
extra bewakpoints bräuchte. Da hab ich wohl bei meinem Glück die einzige 
Ausnahme erwischt.. :-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:

>> Weil die Funktion mit dem Schlüsselwort inline dekoriert ist?
> Das lassen wir uns mal gaaanz langsam auf der Zunge zergehen ;-)

Habe ich dekoriert falsch geschrieben? Ich gehe von dieser Bedeutung 
aus:

Thesaurus-Treffer: Synonyme "auszeichnen, dekorieren, eine Auszeichnung 
verleihen"

Also ein allgemeines Kenntlichmachen (mit einem Schlüsselwort aka 
keyword), ohne die Fälle Definition und Deklaration zu unterscheiden.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> Weil die Funktion mit dem Schlüsselwort inline dekoriert ist?
>> Das lassen wir uns mal gaaanz langsam auf der Zunge zergehen ;-)
> Habe ich dekoriert falsch geschrieben?
> ...Synonyme "auszeichnen...
Hmmm, so gesehen hast du recht.
Dekorieren assoziiere ich allerdings mit Sahnehäubchen, festlichen 
Tafeln und Orden, also eher mit schönen, festlichem Beiwerk.
Ich hätte (im Kontext) eher deklariert bzw. definiert erwartet  :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.