mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfache "for" Schleife funktioniert nicht


Autor: Funghi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich saß gerade an einem kleinen Projekt und wunderte mich, warum mein 
Atmega8 irgendwie nicht das tat, was er meiner Meinung nach tun sollte.

Da ich vor kurzem das Einsteigerset von myAVR erstanden hatte, 
programmierte ich ihn mit der mitgelieferten Software "SiSy".

Da dieses leider keinen Debugger mitliefert, habe ich mal umgeschwenkt 
zum AVR Studio.

Dort habe ich ein ganz einfaches kleines C Programm geschrieben, welches 
interessanterweise nicht funktioniert.

Zuerst dachte ich, meine sämtlichen C Kenntnisse wären eingestaubt..

Eine Überprüfung im Visual Studio (mit exakt dem gleichen Programm) 
erwies sich allerdings als positiv, es funktioniert wunderbar.

Ich weiß mir leider keinen Rat mehr, daher bitte ich hier um Hilfe, 
evtl. hat Jemand solch ein Problem schonmal gehabt?

Um folgenden Code geht es:

#include <avr/io.h>
int main(){
  int i;
  int a;

  while(1){
  for (i=0;i<=5;i++){}

  i=0;

  for (a=0;a<=5;a++){}

  a=0;
  }
}

Das Programm ansich ist antürlich vollkommen Sinnlos, was aber ja nicht 
heißt das es deswegen nicht funktionieren darf.
Ich deklariere mir zwei Variablen (i und a), laufe in eine endlose while 
Schleife und zähle dort in einer for Schleife i bis 5 hoch, komme dann 
aus dieser Schleife heraus und weise i wieder den Wert 0 zu.
Das gleiche mache ich mit "a".

Im Visual Studio funktioniert das ganze tadellos, das Programm bleibt in 
meinen Schleifen, zählt bis 5 , und kommt wieder heraus. So wie es sein 
sollte.

Interessant wird das Ganze allerdings im AVR Studio Debugger.
Hier läuft das Programm in die erste for Schleife, zählt bis 5 , setzt 
auf wundersame weise i SOFORT wieder auf 0 und bleibt in der ersten for 
Schleife kleben...für immer.

Wo ist da bitte der Sinn? Was mache ich falsch?

Gruß

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funghi schrieb:

> Das Programm ansich ist antürlich vollkommen Sinnlos, was aber ja nicht
> heißt das es deswegen nicht funktionieren darf.

Doch, genau das. Insbesondere mit Optimierung.

Ansonsten überleg mal, was eine Beendigung von main() für einen Sinn 
ergibt.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal statt der leeren Schleife irgendeine Anweisung 
reinzuschreiben. Z.B. d++; oder so.

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

Bewertung
0 lesenswert
nicht lesenswert
Hier hat der OPtimizer zugeschlagen.
Der hat rausgefunden, dass dein Programm sinnlos ist und hat es so 
zusammengekürzt, dass zwar die Variablen die richtigen Werte haben, aber 
alles was zeitaufwändig ist rausgeflogen ist.

(Das meine ich ernst! Kein Scherz!)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Ansonsten überleg mal, was eine Beendigung von main() für einen Sinn
> ergibt.

Wie soll main() jemals beendet werden?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte formatierungsbedingt das while übersehen.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funghi schrieb:

> Zuerst dachte ich, meine sämtlichen C Kenntnisse wären eingestaubt..

Ja, könnte man so sagen. Der Compiler optimiert, wie oben bereits 
erklärt. Oft wird das für einen Compilerfehler gehalten, ist es aber 
nicht. Für Erklärung siehe den Verlinkten Artikel im Wiki.

Autor: Funghi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Euch, daran lags :-)
Was µC-Programmmierung angeht bin ich noch frisch, aber man ist ja da um 
zu lernen ;-)

Gruß

Autor: Jasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funghi schrieb:
> Danke Euch, daran lags :-)
> Was µC-Programmmierung angeht bin ich noch frisch, aber man ist ja da um
> zu lernen ;-)

Hat mit µC nichts zu tun, ist eine C-Compiler-Sache.

Wenn Du im Visual Studio die Optimierung einschaltest oder unter Linux 
z.B. mit "gcc -O2" compilierst wird sehr wahrscheinlich auch nicht 
passieren was Du wolltest.

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.