mikrocontroller.net

Forum: Compiler & IDEs Atmega 64, GCC optimiert zuviel weg!


Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

warum wird eigentlich die Zählvariable "loopcnt ", die die Routine 8
mal durchlaufen soll, einfach wegoptimiert?

Als Folge kommt eine Falsche CRC-Summe unten raus. wie kann man das
verhindern?



u16 CRC(unsigned int crc, unsigned char ch)
{
#define CRC_POLYNOME 0x8005

u08 loopcnt;
u08 carry;

   for(loopcnt=0;loopcnt<7;loopcnt++);
   {

      carry = ch >> 7;  // Zeichen links ins Carry schieben
      ch    = ch << 1;

      if(crc & BIT0)
      {
         crc = crc << 1;
         crc = crc | carry;
         crc = crc ^ CRC_POLYNOME;
      }
      else
      {
         crc = crc << 1;
         crc = crc | carry;
      }
   }

   return(crc);
}



so wirds compiliert:


   for(loopcnt=0;loopcnt<7;loopcnt++);
   {

      carry = ch >> 7;  // Zeichen links ins Carry schieben
 54a:  66 1f         adc  r22, r22
 54c:  66 27         eor  r22, r22
 54e:  66 1f         adc  r22, r22
      ch    = ch << 1;

      if(crc & BIT0)
 550:  80 ff         sbrs  r24, 0
 552:  0b c0         rjmp  .+22       ; 0x56a
      {
         crc = crc << 1;
 554:  22 0f         add  r18, r18
 556:  33 1f         adc  r19, r19
         crc = crc | carry;
 558:  86 2f         mov  r24, r22
 55a:  99 27         eor  r25, r25
 55c:  28 2b         or  r18, r24
 55e:  39 2b         or  r19, r25
         crc = crc ^ CRC_POLYNOME;
 560:  85 e0         ldi  r24, 0x05  ; 5
 562:  90 e8         ldi  r25, 0x80  ; 128
 564:  28 27         eor  r18, r24
 566:  39 27         eor  r19, r25
 568:  06 c0         rjmp  .+12       ; 0x576
      }
      else
      {
         crc = crc << 1;
 56a:  22 0f         add  r18, r18
 56c:  33 1f         adc  r19, r19
         crc = crc | carry;
 56e:  86 2f         mov  r24, r22
 570:  99 27         eor  r25, r25
 572:  28 2b         or  r18, r24
 574:  39 2b         or  r19, r25
      }
   }

   return(crc);
}
 576:  c9 01         movw  r24, r18
 578:  08 95         ret




Gruß Martin

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for(loopcnt=0;loopcnt<7;loopcnt++);

Das Semikolon !!!


Peter

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach du sch......

werde ganz rot und nehme alles zurück!!!!!

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.