www.mikrocontroller.net

Forum: Compiler & IDEs WinAVR erzeugt nur Müll


Autor: Philipp B (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hatte ich auch schon.
Der Compiler optimiert deine Schleifen weg.

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


mfg
werner

Autor: Philipp B (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp B (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.