Forum: Compiler & IDEs Schleifen wegoptimierung verhindern bei AVR


von Chillman (Gast)


Lesenswert?

Hallo,

ich hab mir ein kleines Schleifen-Test Programm geschrieben:

#include <avr/io.h>

int main(void)
{
DDRB =0xff;
char i;
char k;

while (1)
  {
  PORTB =0x00;
  k=0x01;
  while (k<=2)
    {
    PORTB =0xff;
    PORTB =0xff;
    k=k+1;
    i=0x01;
    while (i<=2)
      {

      PORTB =0x01;
      i=i+1;
      }
    }

  PORTB =0x00;
  PORTB =0x00;
  }
}

Leider wird hierbei die dritte Schleife wegoptimiert. wenn ich den die 
Bedingung auf i<=4 abänder dann pasiert dies nicht. was ist der 
einfachste weg die optiemierung zu verhindern. Ist die variablen 
deklaration als Volantile eine sinvolle Variante?

Die Optimierung unter Configuration Options ist aktiviert, da ich im 
richtigen Programm auch mit delay arbeite.

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


Lesenswert?

> Leider wird hierbei die dritte Schleife wegoptimiert.

Nein, sie wird nur ,,entrollt''.  Übrig bleibt zweimal die Zuweisung
von 1 nach PORTB.

Du hast eine ziemlich umständliche und schwer zu durchschauende
Ausdrucksweise, um's vornehm zu formulieren.

von Chillman (Gast)


Lesenswert?

Was meinst du mit "entrollt"?

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


Lesenswert?

Chillman wrote:

> Was meinst du mit "entrollt"?

Dass man statt:
1
   lade schleifenzähler
2
   springe zu test
3
schleife:
4
   anweisung
5
   erhöhe schleifenzähler
6
test:
7
   ist schleifenende erreicht?
8
   wenn nicht, springe zu schleife

auch einfach schreiben kann
1
   anweisung
2
   anweisung

wenn von vornherein völlig klar ist, dass die Schleife immer genau
zweimal durchlaufen wird.

von Rolf Magnus (Gast)


Lesenswert?

Wieso sind überhaupt bis auf die erste alle Zuweisungen zum PORTB 
doppelt aufgeführt?

von yalu (Gast)


Lesenswert?

> Wieso sind überhaupt bis auf die erste alle Zuweisungen zum PORTB
> doppelt aufgeführt?

Wenn die I/O-Register durch häufige Benutzung schon etwas ausgeleiert
sind, muss man manchmal die Bits regelrecht reinhämmern, damit sie
auch wirklich drin bleiben :-)

von Chillman (Gast)


Lesenswert?

ne das mit dem PORTB diente nur Testzwecken. und wenn die Funktionen in 
den Schleifen sinnvoller werden, dann werden Diese auch normal 
durchlaufen

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.