Guten Abend,
ich bin eben dabei, mich in die AVRs und AVR Studio (mit WinAVR)
einzuarbeiten. Allerdings hab ich ein kleines Problem: Wenn ich den Code
simulieren will, also Schritt für Schritt abarbeiten will, überspringt
der Debugger-Zeiger manche Zeilen. Ausgeführt wird der Code schon. Ich
sehe es ja an der Stopwatch/Zyklen-Zähler.
Ich versuche mit "Step Into" (F11) eine Zeile nach der anderen zu
beobachten. Wo ist der Fehler?
Mein Code
Ah, daran liegts. Ohne Optimierung macht das Ganze natürlich keinen
Sinn.
Ist die Codeoptimierung generell mit diesem Nachteil verbunden, dass man
den Code nicht mehr ordentlich nacheinander abarbeiten lassen kann?
>Ohne Optimierung macht das Ganze natürlich keinen Sinn.
Das sehe ich nicht so, ist aber Ansichtssache. Mit eingeschalteter
Optimierung verwurstelt der Compiler den Code halt so, daß er zwar noch
das macht, was du willst, aber nicht unbedingt so, wie du willst.
Schließlich soll ja was schnelleres oder kleineres rauskommen, und
danach gibt es halt keine 1:1-Zuordnung zwischen Source- und
Assemblercode mehr.
Ich debugge im Simulator eigentlich immer ohne Optimierung, bis alles
passt. Erst dann mit Optimierung.
Oliver
Igor Metwet wrote:
> Ist die Codeoptimierung generell mit diesem Nachteil verbunden, dass man> den Code nicht mehr ordentlich nacheinander abarbeiten lassen kann?
Sonst wäre es ja keine Optimierung... Darum geht es ja gerade, unnötige
Sachen wegzulassen und den Rest so umzubiegen das es schneller läuft
und/oder kleiner wird.
Stimmt, kann natürlich ohne Codeoptimierung das Programm erstellen und
debuggen. Darf in der Simulation das Programm größer sein, als der zu
programmierende µC oder gibts dann Probleme in Sachen
Speicherverwaltung?
Das Blöde ist halt, dass man auf diese Weise zeitliche Vorgänge gut
kontrollieren kann, höchstens, man lässt die Codeoptimierung ganz weg.
Igor Metwet wrote:
> Stimmt, kann natürlich ohne Codeoptimierung das Programm erstellen und> debuggen.
Man kann sich genauso gut daran gewöhnen, optimierten Code zu debuggen.
Das geht auch. Nimm einfach weniger Einzelschritte, stattdessen lieber
,,sprungweise'' den Code durchgehen. (Auf einem Emulator sind die
Einzelschritte sowieso nicht sonderlich schnell, da spart diese
Vorgehensweise auch Zeit.)
Wenn du wirklich mal den Wert einer Zwischenvariablen brauchst, kannst
du den entsprechenden Wert auch an passender Stelle in eine "volatile"
deklarierte Variable zwischenspeichern. Brauche ich aber eigentlich
ganz selten, meist schau ich mir lieber den Inhalt der CPU-Register an
und versuche, den durch den Compiler generierten Code nachzuvollziehen
um zu verstehen, was jetzt in den jeweiligen Registern drin stehen
sollte.
Danke, für die Infos.
Wie deklariere ich eine Variable in C als volatile?
Diesen Begriff höre ich gerade zum ersten Mal.
Nochwas: Als Optimierer kann man in AVR Studio ja: -00 -01 .. -0s
einstellen. Ist das der Grad der Optimierung? Sollte man möglichst -0s
verwenden, wenn man einen kleinen Code möchte?
Falls das im AVR Tut. benannt wird, dann braucht ihr nicht hierauf zu
antworten, da ich noch nicht ganz mit dem Durchlesen durch bin.
Ihr habt mir gut geholfen. Danke an euch !!
Igor Metwet wrote:
> Wie deklariere ich eine Variable in C als volatile?
Mit dem Schlüsselwort "volatile".
> Diesen Begriff höre ich gerade zum ersten Mal.
Oops, dann solltest du besser erstmal noch kein embedded C anfassen.
Dort braucht man das (und das Verständnis, wofür das gut ist), sehr
viel häufiger als bei Standard-PC-Anwendungen.
Ich bin mir sicher, dass es ausreichend Tutorials im Netz gibt, die
dir die Bedeutung von volatile einleuchtender erklären als der
relativ akademisch anmutende Text des C-Standards (den ich dir hier
sofort zitieren könnte).
> Nochwas: Als Optimierer kann man in AVR Studio ja: -00 -01 .. -0s> einstellen. Ist das der Grad der Optimierung?
Ja, wobei -O0 (oder keine -O-Option) die Optimierung ausschaltet und
-O1 äquivalent zu -O ist.
> Sollte man möglichst -0s> verwenden, wenn man einen kleinen Code möchte?
Als Grundregel ja. Im Detail kannst du natürlich immer mal andere
Varianten vergleichen. Es gibt auch noch eine ganze Reihe mehr oder
minder obskurer Optionen, die mit -f anfangen, und mit denen man
Teiloptimierungen ein- oder ausschalten kann. Grob gesagt, die
verschiedenen -O-Stufen schalten mehr oder minder große Sets dieser
Teiloptierungen zu. Die Details verrät im Großen und Ganzen das
GCC-Manual.