mikrocontroller.net

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


Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <stdint.h>


int main(void)
{

  unsigned char Vari_1;
  unsigned char Vari_2;

  Vari_1 = 4;
  Vari_2 = 55;

PORTB = 2;
for(;;)
{
    
  DDRB = 255;
  PORTB = Vari_2;
  
  DDRC = 255;
  PORTC = Vari_1;

  Vari_1++;
  Vari_2++;

  Vari_2 = Vari_1 + Vari_1;
  Vari_1 = 33;
  Vari_1--;

}

return 0;
}


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optimierung eingeschaltet.

Oliver

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jurij G. (jtr)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht 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 !!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

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.