Летучие структурные семантики

Достаточно ли объявлять экземпляр типизированной переменной как 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

если вы объявите структуру с изменчивым, тогда все ее члены также будут неустойчивыми