私は、次のCコードがあるとします。今C:「ゲッター」機能や、中断して静的揮発性を利用し
/* clock.c */
#include "clock.h"
static volatile uint32_t clock_ticks;
uint32_t get_clock_ticks(void)
{
return clock_ticks;
}
void clock_tick(void)
{
clock_ticks++;
}
私はclock_tick
を呼び出していますが:からget_clock_ticks()
の呼び出し中に、中断中(すなわちclock_ticks
変数をインクリメント) main()
機能(すなわち、中断の外側)。
私の理解では、clock_ticks
は、特に指定のない限り、コンパイラはそのアクセスを最適化し、main()
は(それが実際に中断から変更しながら)値が変更されていないと思わせることができvolatile
として宣言されなければならないということです。
直接(すなわち:static
としてそれを宣言していない)main()
を形成するがget_clock_ticks(void)
機能を使用して、代わりの変数にアクセスすると、実際にそれがvolatileとして宣言されていない場合でも、メモリから変数をロードするようにコンパイラに強制することができているのだろうか。
誰かがこれが起こってできた私に言ったように私はこれを疑問に思います。本当ですか?どのような条件の下で?とにかく私が "ゲッター"機能を使用すれば、私はいつもvolatile
を使うべきですか?
あなたの場合の「揮発性」は必須です。それは、変数が割り込みからアクセスされるときに差をつけています。このようにして、コンパイラは、変数にアクセスして変更することが知られている変数を知っていることを知ります。さもなければあなたの "ゲッター"は変数の一定の初期値を返すでしょう。 –
https://stackoverflow.com/questions/5822386/the-volatile-keyword-in-c-language –
getter関数はインライン展開される可能性があります。キャッシュコヒーレンシの問題があり、それが非決定論的な振る舞いをする可能性があります。 @EugeneSh。 – jxh