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


von Funghi (Gast)


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ß

von (prx) A. K. (prx)


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.

von Peter (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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

von Peter (Gast)


Lesenswert?

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

Wie soll main() jemals beendet werden?

von (prx) A. K. (prx)


Lesenswert?

Hatte formatierungsbedingt das while übersehen.

von Johann L. (gjlayde) Benutzerseite


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.

von Funghi (Gast)


Lesenswert?

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

Gruß

von Jasch (Gast)


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.

Beitrag #5320401 wurde von einem Moderator gelöscht.
Beitrag #5320405 wurde von einem Moderator gelöscht.
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.