WinAVR erzeugt nur Müll

Gast #74826
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?
Gast #74829
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.
Gast #74830
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?

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