C-Frage zu "volatile"

Gast #181694
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
> 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
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
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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.