www.mikrocontroller.net

Forum: GCC Warnung bei volatile Variablen

Autor: Ulrich aus W (Gast)
Datum: 02.05.2008 18:53

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: 02.05.2008 19:01

char kann, je nach Implementation, als signed oder unsigned char
behandelt werden.
Autor: Sven Pauli (haku) Benutzerseite
Datum: 02.05.2008 19:02

> 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: 02.05.2008 19:11

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: 02.05.2008 19:26

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: 02.05.2008 19:36

Danke, Danke :-)
Alle Tipps haben geholfen.

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net