mikrocontroller.net

Forum: Compiler & IDEs Datentypen, Probleme mit Überlauf


Autor: Batti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Datentyp nehmen, der ausreichend groß ist, also z. B. uint16_t.

Autor: Batti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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."

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Batti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs damit:

unsigned char i;

for(i=0;; i++)
{
     // tu was
  if( i == 255 )
    break;
}


Peter

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.