Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Volatile Struct Semantics

Tags:

c

struct

volatile

Is it sufficient to declare an instance of a structure-typed variable as volatile (if its fields are accessed in re-entrant code), or must one declare specific fields of the structure as volatile?

Phrased differently, what are the semantic differences (if any) between:

typdef struct {   uint8_t bar; } foo_t;  volatile foo_t foo_inst; 

and

typedef struct{   volatile uint8_t bar; } foo_t;  foo_t foo_inst; 

I recognize that declaring a pointer-typed variable as volatile (e.g. volatile uint8_t * foo) merely informs the compiler that the address pointed-to by foo may change, while making no statement about the values pointed to by foo. It is unclear to me whether an analogy holds for structure-typed variables.

like image 749
vicatcu Avatar asked Jan 11 '10 20:01

vicatcu


People also ask

What is a volatile struct?

The volatile structure is a member of a non-volatile structure, a pointer to which is used to access a register.

What is volatile programming language?

In computer programming, particularly in the C, C++, C#, and Java programming languages, the volatile keyword indicates that a value may change between different accesses, even if it does not appear to be modified.

What is the volatile keyword in C++?

Volatile is a qualifier that is applied to a variable when it is declared. It tells the compiler that the value of the variable may change at any time-without any action being taken by the code the compiler finds nearby.

Where is volatile keyword stored?

There's no reason for a volatile variable to be stored in any "special" section of memory. It is normally stored together with any other variables, including non-volatile ones. If some compiler decides to store volatile variables in some special section of memory - there's nothing to prevent it from doing so.


2 Answers

In your example, the two are the same. But the issues revolve around pointers.

First off, volatile uint8_t *foo; tells the compiler the memory being pointed to is volatile. If you want to mark the pointer itself as volatile, you would need to do uint8_t * volatile foo;

And that is where you get to the main differences between marking the struct as volatile vs marking individual fields. If you had:

typedef struct {     uint8_t *field; } foo;  volatile foo f; 

That would act like:

typedef struct {     uint8_t * volatile field; } foo; 

and not like:

typedef struct {     volatile uint8_t *field; } foo; 
like image 132
R Samuel Klatchko Avatar answered Nov 16 '22 00:11

R Samuel Klatchko


if you declare a structure with volatile then all its members will also be volatile

like image 25
Alon Avatar answered Nov 16 '22 00:11

Alon