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.
The volatile structure is a member of a non-volatile structure, a pointer to which is used to access a register.
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.
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.
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.
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;
if you declare a structure with volatile then all its members will also be volatile
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With