易失性结构语义

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

措辞不同,两者之间的语义差异是什么(如果有的话) :

typdef struct {
uint8_t bar;
} foo_t;


volatile foo_t foo_inst;

还有

typedef struct{
volatile uint8_t bar;
} foo_t;


foo_t foo_inst;

我认识到,将指针类型的变量声明为 volic (例如,voluint8 _ t * foo)只是告诉编译器 foo 指向的地址可能会改变,而没有对 foo 指向的值进行声明。对我来说,结构类型的变量是否适用类比还不清楚。

42335 次浏览

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

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

这就是您了解将结构标记为 volatile 与标记单个字段之间的主要区别的地方。如果你有:

typedef struct
{
uint8_t *field;
} foo;


volatile foo f;

这就像是:

typedef struct
{
uint8_t * volatile field;
} foo;

而不是:

typedef struct
{
volatile uint8_t *field;
} foo;

如果你声明一个结构具有易失性,那么它的所有成员也将是易失性的