Warnung bei volatile Variablen

Gast #857950
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.
Gast #857957
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren