Семантика изменчивой структуры - PullRequest
62 голосов
/ 11 января 2010

Достаточно ли объявить экземпляр переменной со структурным типом как volatile (если к ее полям обращаются в коде с повторным входом), или нужно объявить определенные поля структуры как 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 (например, volatile uint8_t * foo) просто сообщает компилятору, что адрес, на который указывает foo, может измениться, не делая никаких заявлений о значениях, на которые указывает foo. Мне неясно, справедлива ли аналогия для структурно-типизированных переменных.

Ответы [ 2 ]

70 голосов
/ 11 января 2010

В вашем примере два одинаковы. Но проблемы вращаются вокруг указателей.

Во-первых, 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;
17 голосов
/ 11 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...