Летучие структурные семантики
Достаточно ли объявлять экземпляр типизированной переменной как volatile (если его поля обращаются в код повторного входа), или нужно объявлять определенные поля структуры как изменчивые?
Понятно иначе, каковы семантические различия (если есть) между:
typdef struct {
uint8_t bar;
} foo_t;
volatile foo_t foo_inst;
и
typedef struct{
volatile uint8_t bar;
} foo_t;
foo_t foo_inst;
Я понимаю, что объявление переменной типа указателя как изменчивой (например, volatile uint8_t * foo) просто сообщает компилятору, что адрес, на который указывает foo, может измениться, не делая никаких утверждений о значениях, на которые указывает foo. Мне непонятно, существует ли аналогия для структурно-типизированных переменных.
Ответы
Ответ 1
В вашем примере два одинаковые. Но проблемы вращаются вокруг указателей.
Во-первых, volatile uint8_t *foo;
сообщает компилятору, что указываемая память является неустойчивой. Если вы хотите пометить сам указатель как изменчивый, вам нужно будет сделать uint8_t * volatile foo;
И именно здесь вы получаете основные отличия между маркировкой структуры как изменчивой и маркировкой отдельных полей. Если у вас есть:
typedef struct
{
uint8_t *field;
} foo;
volatile foo f;
Это будет действовать следующим образом:
typedef struct
{
uint8_t * volatile field;
} foo;
и не нравится:
typedef struct
{
volatile uint8_t *field;
} foo;
Ответ 2
если вы объявите структуру с изменчивым, тогда все ее члены также будут неустойчивыми