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
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>.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.