Hi! Ich brauche nochmal eure fachkundige Hilfe. Habe grundsätzliche Probleme mit einer for-Schleife: unsigned char i; for(i=0; i<=255; i++) { // tu was } Bei dieser Schleifenausführung erhöht der µC beim letzten durchlauf nochmal "255 + 1", dadurch scheint es einen Überlauf zu geben, der dann zu einer Endlosschleife führt. Programmtechnisch wichtig ist, dass ich einmal den ganzen Byte-Datentyp "abgrase" (0-255). Ich denke das der Datentyp "unsigned char" nicht der richtige für diesen Fall ist.Habe schon mit "uint8_t" gearbeitet, da ich diese Variante öfters gesehen habe -> gleicher Effekt... Wie macht man so etwas banales richtig? Schonmal vielen Dank! Batti
Einen Datentyp nehmen, der ausreichend groß ist, also z. B. uint16_t.
Sorry, aber das muss doch auch anders gehen... Bei einem größeren Datentyp würde ich ja acht Bit nur verschwenden damit ich die anderen 8Bit voll ausnutzen kann... Das ist nicht so ganz das was ich möchte. Zur not könnte ich ja noch etwas mit einer Do...While bauen, aber ich denke doch mal das es grundsätzlich möglich sein müsste dies mit einem 8Bit Datentyp + for-Schleife zu machen...
Du denkst falsch. Wenn dir die drei Takte oder so wirklich so wichtig sind, musst du mit der do-while-Krücke leben. Denk an den alten Spruch: "Never try to optimize something before you have profiled it."
Die Schleife hat nun mal keine Abbruchbedingung. Was erwartest du? Entweder <255 oder einen int nehmen. Wenn es dich beruhigt, du verschwendest nur 7 bit. Das 8. bit (256) soll ja die Schleife beenden. Eine Möglichkeit (evtl) ist nach "tu was" i auf 255 prüfen und mit einem break die Schleife verlassen. MW
Ok, gebe mich geschlagen... Ich meine nur mal etwas von einem "künstlichen Datentyp" gehört zu haben, der gerade dafür konstruiert wurde um einen Überlauf zu verhindern. Naja, nun gut. Trotzdem vielen Dank für eure Tipps. Batti
Wenn es Dir wirklich auf das 8- statt 16-Bit ankommt, dann kommst Du an do.. while nicht herum, weil Du den Überlauf mit auswerten musst, um auf 256 zu kommen: uint8_t i; i = 0; do{ asm ("nop"); // mach was while(++i); Das Ganze ist aber ziemlich riskant: Du solltest unbedingt die Datentyp-Breite angeben, ein char kann mal 8 oder auch 16 Bit breit sein, und dann läuft Deine Schleife etwas länger ... Obiges Beispiel übersetzt: 164 0080 80E0 ldi r24,lo8(0) 165 .L11: 170 0084 0000 nop 173 0086 8F5F subi r24,lo8(-(1)) 174 0088 E1F7 brne .L11
Wie wärs damit: unsigned char i; for(i=0;; i++) { // tu was if( i == 255 ) break; } Peter
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.