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>.