Forum: Compiler & IDEs volatile unsigned char i[9] unzulässig?


von Hannes (Gast)


Lesenswert?

Hallo,

weiss jemand, ob die (globale) Variablendefinition

volatile unsigned char i[9];

zulässig ist?

Wenn ich in einer ISR-Routine auf i zugreifen will (z. B. mit strcpy), 
erhalte ich beim kompilieren:

"warning: passing arg 2 of `strcpy' discards qualifiers from pointer 
target type"

Kennt jemand die Ursache?

Danke!

Hannes

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hannes wrote:

> weiss jemand, ob die (globale) Variablendefinition

> volatile unsigned char i[9];

> zulässig ist?

Ja, aber in der Regel nicht sinnvoll.

> "warning: passing arg 2 of `strcpy' discards qualifiers from pointer
> target type"

> Kennt jemand die Ursache?

Das strcpy() weiß nichts über die volatile-ness und ignoriert sie
daher.  Wenn der Code trotzdem funktioniert, hast du das sicherste
Anzeichen, dass du das volatile auch gleich hättest ganz weglassen
können.

Sicher kann man auch Fälle konstruieren, bei denen man das volatile
auch bei einem Array benutzen muss, aber ich würde das nicht tun.  Die
Regel "Alle Variablen, die sowohl in ISRs als auch außerhalb genutzt
werden als volatile deklarieren." ist leider eine mittelmäßige
Vereinfachung, die nur dazu gut ist, dass man sich nicht mit all dem
Gedöns über abstrakte Maschinen und Sequenzpunkte aus dem C-Standard
beschäftigen muss.  Es müssen lediglich solche Objekte volatile
deklariert sein, bei denen der Compiler in die Verlegenheit kommen
könnte, Zugriffe auf diese zu optimieren.  Das trifft insbesondere auf
die beliebten Flags zu (also Variablen, die in der ISR gesetzt werden
und im Hauptzweig getestet um festzustellen, ob in der ISR was
passiert ist).  Wenn man den Zugriff auf das Array im Hauptzweig mit
dem Test auf ein derartiges (dann wirklich volatile) Flag vorher
absichert, dann muss das Array selbst nicht volatile sein.  Dafür kann
man dann mit dem Array "ganz normal" arbeiten, einschließlich der
gängigen Funktionen aus <string.h>.

von Hannes (Gast)


Lesenswert?

Danke Jörg!

Hannes

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.