Schleifen wegoptimierung verhindern bei AVR

Gast #626341
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.
Moderator Persönliche Seite #626406
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.
Gast #626952
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren