1. ホーム
  2. c

揮発性構造セマンティクス

2023-09-23 17:29:07

質問

構造体型変数のインスタンスを 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 が指す値については何も宣言していないことを認識しています。この類似性が構造体型の変数に当てはまるかどうかは、私には不明です。

どのように解決するのか?

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

まず最初に 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;