将结构类型变量的实例声明为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指向的值。我不清楚类比是否适用于结构类变量。
答案 0 :(得分:70)
在你的例子中,两者是相同的。但问题围绕着指针。
首先,volatile uint8_t *foo;
告诉编译器指向的内存是volatile。如果要将指针本身标记为volatile,则需要执行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;
答案 1 :(得分:17)
如果你声明一个带有volatile的结构,那么它的所有成员也将是易失性的