mikrocontroller.net

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


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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>.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg!

Hannes

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.