www.mikrocontroller.net

Forum: Compiler & IDEs Warnung bei volatile Variablen


Autor: Ulrich aus W (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.

In einer ISR wird ein Inkrementalgeber abgefragt.
Die globale Variable icount wird in der ISR entsprechend
der Drehrichtung und der Impulsanzahl herauf- oder heruntergezählt.
Das Hauptprogramm wertet die Variable aus und soll auch die
maximalen Werte begrenzen.
Hier die entsprechenden Ausschnitte aus dem Programm:


volatile char icount;

int main(void)
{
  .
  if(icount > 4) icount = 1;
  if(icount < 0) icount = 4; ## warning ##
  .
}

ISR(TIMER0_OVF_vect)
{
  .
  if…
      icount++;
  else
      icount—-;
  .
}

Verblüffend für mich ist die Warnung, die der Compiler für die
mit ## markierte Zeile ausgibt.

warning: comparison is always false due to limited range of data type

Der erzeugte ASM-Code für die Zeile ist Schwachsinn.
Eine char Variable kann doch auch negativ werden. oder?
Werden mit volatile deklarierte Variablen immer als unsigned verstanden?

Ich habe das Problem dadurch gelöst, dass ich icount jetzt immer mit
einem Offset laufen lasse, sodass er nicht unter Null kommen kann.
Das Programm läuft damit gut.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char kann, je nach Implementation, als signed oder unsigned char 
behandelt werden.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> volatile char icount;
>
> int main(void)
> {
>   .
>   if(icount > 4) icount = 1;
>   if(icount < 0) icount = 4; ## warning ##
>   .
> }

> Eine char Variable kann doch auch negativ werden. oder?
> Werden mit volatile deklarierte Variablen immer als unsigned verstanden?

Also... char ist immer net so gut. Es hängt vom Compiler und dessen 
Optionen ab, ob ein "char" mit Vorzeichen ist oder eben nicht. Wenn du 
ein Byte zum Rechnen haben möchtest, verwende die Typen aus "stdint.h" 
(z.B. int8_t oder uint8_t, je nach dem). Wenn du ein Byte als Speicher 
für ein Zeichen (ASCII oder so) brauchst, dann, und nur dann, benutze 
ein "char". In dem Fall aber dann vorher wieder in einen Typ aus 
"stdint.h" casten, wenn gerechnet werden soll.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möglicherweise hast du dem Compiler die Option -funsigned-char
mitgegeben. Aber du gehst den ganzen Problemen aus dem Weg, wenn du es
so machst wie Sven Pauli.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du ein char brauchst, das auf jeden Fall ein Vorzeichen hat, wäre 
es das einfachste und sicherste, dies dem Compiler auch zu sagen:
volatile signed char icount;

Autor: Ulrich aus W (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Danke :-)
Alle Tipps haben geholfen.

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.