易失性结构语义

将结构typesvariables的实例声明为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; 

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

在你的例子中,两者是一样的。 但问题围绕着指针。

首先, volatile uint8_t *foo; 告诉编译器指向的内存是不稳定的。 如果你想把指针本身标记为volatile,你需要做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; 

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