Forum: Compiler & IDEs WinAVR erzeugt nur Müll


von Philipp B (Gast)


Lesenswert?

Hallo, ich hab da ein paar Probleme mit WinAVR. Der Compiler läuft zwar
ohne Probleme, aber die Programme tun nicht annähernt das was sie
sollten.

z.B.:
#include <io.h>
#include <inttypes.h>

void delay(uint16_t lauf);

void delay(uint16_t lauf)
{
  while (--lauf);
}

int main( void )
{
  DDRB  = 0xff;  // PORTB auf Output
  PORTB = 0x00;  // Alles aus

  while (1){
    PORTB= 0x01;
    delay(8000);
    PORTB= 0x02;
    delay(8000);
  }
}

===============================================
Das Programm soll eigentlich LEDs an PortB zum blinken bringen. Leider
erzeugt der Compiler ein Programm welchen einfach nur in den ersten
beiden Befehlen springt (hab ich mit dem AVR-Studio getestet.)
Wenn ich das Programm ohne funktion scheibe, (also den delay in die
while-schleife packe) funktionierts.

nächstes Beispiel:
  while (1)
  {
    PORTB= 0x01;
    for (i=0;i>=40000;i++)
        for (j=0;j>=2;j++);

    PORTB= 0x02;
    for (i=0;i>=40000;i++)
        for (j=0;j>=2;j++);
  }

Hier werden die verschachtelten for-Schleifen einfach ignoriert. Wenn
ich statt einer for-Schleife eine while-Schleife nehme, funktioniert
es.

Ich hab keine Ahnung wodran das liegt.
Kann mir jemand helfen?

von Werner Hoch (Gast)


Lesenswert?

Das hatte ich auch schon.
Der Compiler optimiert deine Schleifen weg.

http://www.mikrocontroller.net/forum/read-2-27687.html


mfg
werner

von Philipp B (Gast)


Lesenswert?

ich hab die Variable als "volatile" deklariert. Also sollte daran
nicht liegen.
Wenn ich zwei einzelne Schleifen habe, läuft das ohne Probleme. Und mit
ner while-Schlife auch.

von Philipp B (Gast)


Lesenswert?

ich glaub ich bin etwas weiter gekommen.

zum 1. Problem:
Es scheint, dass WinAVR immer die erst funktion als "main" annimmt
und dadurch eine Endlosschleife ganz am Anfang erzeugt. Schreib ich
meine delay funktion unter main, taucht das Problem nicht auf. scheint
wohl ein Bug zu sein, oder so.

zum 2. Problem:
unter irgendwelchen, mir noch unbekannten Gründen optimiert der
Compiler die Scheifen wirklich weg.

von Joerg Wunsch (Gast)


Lesenswert?

Nein, der Compiler nimmt nur das als main(), wo auch main() drüber
steht.  Außerdem besitzt main() selbst keine Endlosschleife, sondern
eine solche befindet sich in der Bibliotheksfunktion _exit(), die
bei Bedarf angesprungen wird, wenn Dein main() ein return macht.

Ja, Schleifen werden wegoptimiert.  Benutze die Makros aus
<avr/delay.h>, um gezielte und definierte Verzögerungen zu
erhalten.

Ansonsten: benutzt Dein Makefile zum Linken auch die korrekte
-mmcu Option?

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.