mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktion wird wegoptimiert im AVR Studio mit gcc


Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo libe Leute,

Bei der Programmierung eine Warteschleife ist mir in meinem richtigen 
Projekt aufgefallen dass diese auf irgendeine Art und Weise gar nicht 
erkannt wird bzw aufgerufen wird. Nach einigen Nachforschungen bin ich 
dann auf verschiede Threads gestoßen die besagen dass bei 
eingeschalteter Optimierung diese Funktion wegen irgeneines Grundes 
umgangen wird. Mit ausgeschalteter Optimierung funktioniert es SUPER. 
Kann mir jemand sagen wo der Fehler liegt?

Der Quellcode liegt im Anhang und ist aus nem Buch.Hier ein Auszug aus 
dem lss-File.

#######################################################################
0000005e <delay>:
void delay(unsigned int time)
{
  unsigned int i;
  for(i=0;i<time;i++);
}
  5e:  08 95         ret

00000060 <main>:
{
  delay(3500);

  while(1)
   {
     asm("nop");
  60:  00 00         nop
  62:  fe cf         rjmp  .-4        ; 0x60 <main>

00000064 <_exit>:
  64:  f8 94         cli

00000066 <__stop_program>:
  66:  ff cf         rjmp  .-2        ; 0x66 <__stop_program>
#######################################################################

Vielen Dank! Benny.

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da es mit dem Anhang nicht so richtig geklappt hat hier den Quelltext:

void delay(unsigned int time)
{
  unsigned int i;
  for(i=0;i<time;i++);
}

void main (void)
{
  delay(3500);

  while(1)
   {
     asm("nop");

   }
}

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Teil
for(i=0;i<time;i++);

ist für den Compiler sinnlos, weil er nix tut. Für dich ist er aber 
nötig, weil du eine Zeit warten willst.
Wenn das nicht passieren soll, musst du die Variable "i" als volatile 
(flüchtig) deklarieren. Dann wird es nicht wegoptimiert.
void delay(unsigned int time)
{
  volatile unsigned int i;
  for(i=0;i<time;i++);
}

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke dir!!!
Jetzt funktioniert die Sache Super. Benny

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.