www.mikrocontroller.net

Forum: Compiler & IDEs C-Frage zu "volatile"


Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
mal eine Frage zu volatile, die sich sich in meinen C-Quellen leider
nicht beantworten ließ: Reicht es die Variable als "volatile" zu
deklarieren und später ganz normal zu verwenden oder muß ich es
zusätzlich auch noch bei einer Funktionsdeklaration machen, in der ich
die Variable als Parameter übergebe, etwa so:
void Function (volatile int variable) {}
?
Danke und Gruß

Lutz

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> void Function (volatile int variable) {}

Nein, in diesem Fall nicht. Faustregel: Verwende "volatile"
syntaktisch wie "const".
Du darfst ja sowas schreiben:
void f(int var);
const int i = 0;
f(i);

Der Parameter wird by value, also als Kopie, übergeben. Wenn du ihn
allerdings als Zeiger übergibst, brauchst du volatile:
void f(int* var);
volatile int i = 0;
f(&i); /* Fehler, volatile fehlt */

Hier muss die Funktionsdeklaration so aussehen:
void f(volatile int* var);

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich hab eine ähnliche Frage:

Ich hab hier eine Funktion, die ein Byte von einem Port abliest:

bool ReadByte (uint8_t* pDataByte);

Sie returned true (0x1) wenns geklappt. Dann soll in *pDataByte der
Portstatus gesichert sein. Nach einigem Experimentieren stellte ich
schließlich fest, dass die Funktionion genau dann funktioniert, wenn
sie so deklariert ist:

bool ReadByte (uint8_t* volatile pDataByte);

Diese Deklaration hier:

bool ReadByte (volatile uint8_t* pDataByte);

liefert ebenso Mist, wie die erste.

Ich rufe die Funktion immer wie folgt:

uint8_t B;
...
if (!ReadByte (&B)) {...}


Kann mir jemand erklären, was da jeweils passiert?

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... sehr konfuser Text :) sorry.

Also ich meine: nur bei der Deklaration "bool ReadByte (uint8_t*
volatile pDataByte);" steht nach dem Aufruf der Funktion der richtige
Wert in B... Warum?

Danke,
Rainer.

Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, daß der Port volatile sein muß und nicht ein Pointer
darauf.
Ports werden in ANSI-C als volatile Variablen mit konstanter Adresse
definiert (vorausgesetzt, die Ports liegen im Adressraum und nicht in
einem separaten I/O-Space):

// Macros for simple Port definitions. Example: #define foo
mc_PORT_u32(1234)
#   define mc_PORT_u8(x)  (*(volatile u8*)(x))
#   define mc_PORT_u16(x) (*(volatile u16*)(x))
#   define mc_PORT_u32(x) (*(volatile u32*)(x))
#   define mc_PORT_u64(x) (*(volatile u64*)(x))

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.