Forum: Compiler & IDEs Warnung bei volatile Variablen


von Ulrich aus W (Gast)


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.

von Stefan Salewski (Gast)


Lesenswert?

char kann, je nach Implementation, als signed oder unsigned char 
behandelt werden.

von Sven P. (Gast)


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.

von yalu (Gast)


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.

von Stefan E. (sternst)


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;

von Ulrich aus W (Gast)


Lesenswert?

Danke, Danke :-)
Alle Tipps haben geholfen.

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.