将一个结构类型变量的实例声明为易失性(如果其字段是在可重入代码中访问的)是否足够,或者必须将结构的特定字段声明为易失性?
换句话说,它们之间的语义差异(如果有的话)是什么:
typdef struct {
uint8_t bar;
} foo_t;
volatile foo_t foo_inst;
和
typedef struct{
volatile uint8_t bar;
} foo_t;
foo_t foo_inst;
我认识到,将指针类型的变量声明为易失性(例如,易失性uint8_t * foo)只是通知编译器foo指向的地址可能会改变,而不会对foo指向的值做任何声明。我不清楚类比是否适用于结构类型的变量。
发布于 2010-01-12 04:13:18
在您的示例中,这两个是相同的。但问题围绕着指针。
首先,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;
发布于 2010-01-12 04:16:59
如果用volatile声明一个结构,那么它的所有成员也都是volatile的
https://stackoverflow.com/questions/2044565
复制相似问题