Forum: Mikrocontroller und Digitale Elektronik GCC: "variable x set but not used" für einzelne Var unterdrücken?


von dunno.. (Gast)


Lesenswert?

Hallo Zusammen,

der Titel sagts eigentlich schon:

Wie kann ich eine einzelne Warnung vom GCC:

"variable 'tmp' set but not used [-Wunused-but-set-variable]"

unterdrücken, ohne diese Warnungen direkt abzuschalten?

Situation:
Ich leere ein FIFO einer SSP(SPI)-Schnittstelle nach dem Senden eines 
Blocks, indem ich dummy reads mache.
Die Warnung ist also prinzipiell richtig, an dieser Stelle aber 
überflüssig..
1
void flushFifo()
2
{
3
  uint8_t tmp;
4
5
  while(SSPSR & SSP_RNE)
6
  {
7
    tmp = SSPDR; //Flush: set but not used is ok here
8
  }
9
}

Ist es möglich dem GCC mitzuteilen, dass dieses an dieser einen 
bestimmten Stelle ok ist? Oder muss ich weiterhin per Kommentar darauf 
aufmerksam machen, was da passiert?

Danke
dunno..

von Peter II (Gast)


Lesenswert?

dunno.. schrieb:
> indem ich dummy reads mache.

dann lass doch die Variable weg
1
void flushFifo()
2
{
3
  while(SSPSR & SSP_RNE)
4
  {
5
    SSPDR; //Flush: set but not used is ok here
6
  }
7
}

von Stefan1234 (Gast)


Lesenswert?

tmp volatile deklarieren.

von Christoph H. (Gast)


Lesenswert?

Hallo dunno..,

1
uint8_t tmp __attribute__((unused));

Siehe auch 
https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Variable-Attributes.html

Gruß Christoph

von Verunsicherter (Gast)


Lesenswert?

Kannst Du nicht einfach
1
SSPDR;
 schreiben?

von dunno.. (Gast)


Lesenswert?

Stefan1234 schrieb:
> tmp volatile deklarieren.

Hilft nicht.

Peter II schrieb:
> dann lass doch die Variable weg
> void flushFifo()
> {
>   while(SSPSR & SSP_RNE)
>   {
>     SSPDR; //Flush: set but not used is ok here
>   }
> }

Das hatte ich anfangs so, wird aber mit einem
Statement has no effect 'SSPDR'
belohnt -
Das allerdings von der Code Analyse meines Eclipses, nicht von GCC.


Nach deinem post habe ich es nochmal so getestet, wenn ich das 
Disassembly richtig deute, tut es dann auch was es soll.

Also sollte ich mir wohl anschauen, warum die Code Analyse da nen 
Problem mit hat.....

btw:
1
#define SSPDR       (*((volatile unsigned long *) 0xE005C008))

von (prx) A. K. (prx)


Lesenswert?

Probiers mal mit
    (void)SSPDR;

von dunno.. (Gast)


Lesenswert?

Christoph H. schrieb:

> uint8_t tmp __attribute__((unused));
> Siehe auch
> https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Variable-Attributes.html

Das funktioniert. Gut zu wissen, ich hatte mich bloß nicht getraut das 
Attribut anzuwenden, weil ich die Variable ja doch irgendwie benutze, 
und nicht riskieren wollte, dass die Zeile dann wegoptimiert wird, oder 
so..

A. K. schrieb:
> Probiers mal mit
>     (void)SSPDR;

Das funktioniert auch, es spart im vergleich zur Variante 1 die 
Variable, und entsprechend den Schreibzugriff auf das Register im ASM.

Drauf gekommen wäre ich allerdings nicht. -

Wieso funktioniert Variante 2 überhaupt?
Wenn ich jetzt Präprozessor spiele:
1
(void)(*((volatile unsigned long *) 0xE005C008));

also ein auf void gecasteter zugriff auf die Zieladresse eines 
pointers...?

Danke an Alle!

von (prx) A. K. (prx)


Lesenswert?

dunno.. schrieb:
> Wieso funktioniert Variante 2 überhaupt?

Im Prinzip ist zwischen
  SPDR;
und
  (void)SPDR;
kein Unterschied. Faktisch aber ist es ein Wink an alle Interessierten, 
dass dieser scheinbar unsinnige Code tatsächlich beabsichtigt ist. Also 
dass die Operation rechts vom (void) zwar ein Ergebnis produziert, dies 
aber nicht genutzt wird.

: Bearbeitet durch User
von Rudolph (Gast)


Lesenswert?

So ist die Warnung auch weg:
1
  uint8_t tmp;
2
3
  while(SSPSR & SSP_RNE)
4
  {
5
    tmp = SSPDR; //Flush: set but not used is ok here
6
  }
7
  tmp = tmp;

Also ganz ohne volatile.

von Peter D. (peda)


Lesenswert?

Rudolph schrieb:
> Also ganz ohne volatile.

Mir gefällt das
1
(void)SSPDR;
 besser.

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.