Forum: Compiler & IDEs Datentypen, Probleme mit Überlauf


von Batti (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

Einen Datentyp nehmen, der ausreichend groß ist, also z. B. uint16_t.

von Batti (Gast)


Lesenswert?

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...

von Jörg Wunsch (Gast)


Lesenswert?

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."

von Michael Wilhelm (Gast)


Lesenswert?

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

von Batti (Gast)


Lesenswert?

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

von Stefan Kleinwort (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.