C-Frage zu "volatile"

Gast #181694
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
Gast #181695
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);
Gast #181696
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?
Gast #181697
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.
Gast #181698
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren