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
for(loopcnt=0;loopcnt<7;loopcnt++); Das Semikolon !!! Peter
ach du sch...... werde ganz rot und nehme alles zurück!!!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.