80

構造体型変数のインスタンスを揮発性として宣言するだけで十分ですか(そのフィールドが再入可能コードでアクセスされる場合)、または構造の特定のフィールドを揮発性として宣言する必要がありますか?

別の言い方をすれば、以下の間の意味上の違い(もしあれば)は何ですか?

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が指す値については何も記述しません。構造型変数に類推が当てはまるかどうかは私にはわかりません。

4

2 に答える 2

83

あなたの例では、2つは同じです。しかし、問題はポインタを中心に展開します。

まず、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-11T20:13:17.577 に答える
27

volatileで構造を宣言すると、そのすべてのメンバーもvolatileになります

于 2010-01-11T20:16:58.687 に答える