易失性结构语义

vic*_*tcu 65 c struct volatile

将结构类型变量的实例声明为volatile是否足够(如果其字段是以可重入代码访问的),还是必须将结构的特定字段声明为volatile?

换句话说,两者之间的语义差异(如果有的话)是什么:

typdef struct {
  uint8_t bar;
} foo_t;

volatile foo_t foo_inst;
Run Code Online (Sandbox Code Playgroud)

typedef struct{
  volatile uint8_t bar;
} foo_t;

foo_t foo_inst;
Run Code Online (Sandbox Code Playgroud)

我认识到将指针类型的变量声明为volatile(例如,volatile uint8_t*foo)只是告诉编译器foo指向的地址可能会改变,而不会声明foo指向的值.我不清楚类比是否适用于结构类型的变量.

R S*_*hko 72

在您的示例中,两者是相同的.但问题围绕着指针.

首先,volatile uint8_t *foo;告诉编译器指向的内存是volatile.如果要将指针本身标记为易失性,则需要执行此操作uint8_t * volatile foo;

这就是你将结构标记为易失性与标记单个字段之间的主要区别.如果你有:

typedef struct
{
    uint8_t *field;
} foo;

volatile foo f;
Run Code Online (Sandbox Code Playgroud)

这将表现为:

typedef struct
{
    uint8_t * volatile field;
} foo;
Run Code Online (Sandbox Code Playgroud)

而不是像:

typedef struct
{
    volatile uint8_t *field;
} foo;
Run Code Online (Sandbox Code Playgroud)

  • 基础数据是不稳定的。需要考虑的一件事是“有效”指针是不可修改的(它始终是第一个元素的地址),因此 volatile 对它没有任何意义。 (3认同)
  • 如果该字段是“uint8_t field[10]”,那么当您将该结构标记为易失性时,基础数据是否标记为易失性,或者指向标记为易失性的字段的“有效”指针? (2认同)
  • 结构“定义”可以标记为易失性吗?或者必须仅保留 typedef 或实例变量? (2认同)

Alo*_*lon 20

如果你声明一个带有volatile的结构,那么它的所有成员也将是volatile

  • 在侧边栏上,对于const也是如此 (4认同)