Forum: Compiler & IDEs Einfache Simulation klappt nicht richtig (AVR Studio)


von Igor M. (bastel-wastel)


Lesenswert?

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
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
5
int main(void)
6
{
7
8
  unsigned char Vari_1;
9
  unsigned char Vari_2;
10
11
  Vari_1 = 4;
12
  Vari_2 = 55;
13
14
PORTB = 2;
15
for(;;)
16
{
17
    
18
  DDRB = 255;
19
  PORTB = Vari_2;
20
  
21
  DDRC = 255;
22
  PORTC = Vari_1;
23
24
  Vari_1++;
25
  Vari_2++;
26
27
  Vari_2 = Vari_1 + Vari_1;
28
  Vari_1 = 33;
29
  Vari_1--;
30
31
}
32
33
return 0;
34
}

von Oliver (Gast)


Lesenswert?

Optimierung eingeschaltet.

Oliver

von Igor M. (bastel-wastel)


Lesenswert?

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?

von Oliver (Gast)


Lesenswert?

>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

von X. Y. (jtr)


Lesenswert?

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.

von Igor M. (bastel-wastel)


Lesenswert?

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.

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


Lesenswert?

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.

von Igor M. (bastel-wastel)


Lesenswert?

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 !!

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


Lesenswert?

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.

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.