メモリバリアはメモリアクセスの順序に関するものですが、値がレジスタにとどまらず、メモリに書き込まれることも保証する必要があります。
TI のコンパイラでこれを強制する唯一の方法は、volatile
.
volatile
は変数の修飾子ですが、その実装では変数自体 (つまり、そのメモリ) についてではなく、この変数へのすべてのアクセスについてであることに注意してください。したがって、最適化が少なすぎることによる影響を避けたい場合は、一部の変数アクセスのみが揮発性になるようにプログラムを作成してください。
これを行うには、変数を通常どおりに宣言し、変数volatile
の読み取りまたは書き込みを強制する場合にのみ追加します。次のようなヘルパー関数を使用できます。
inline void force_write(int *ptr, int value)
{
*(volatile int *)ptr = value;
}
または、Linux から盗んだこの気の利いたマクロを使用して、読み取り/書き込みの両方とすべてのタイプに使用できます。
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
...
if (ACCESS_ONCE(ready) != 0)
ACCESS_ONCE(new_data) = 42;
(名前には歴史的な理由があります。より適切な呼び名FORCE_ACCESS
です。)