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


von Lutz Müller (Gast)


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

von Chris (Gast)


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);

von Rainer (Gast)


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?

von Rainer (Gast)


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.

von Rolf F. (Gast)


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

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.