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