4

TI C/C++ コンパイラ v6.1 ユーザー ガイド ( spru514e ) を調べましたが、何も見つかりませんでした。

asmステートメントはこの点に関して何も提供していないようです.マニュアルは変数の値を変更することに対してさえ警告しています(p132) 。変数への影響を宣言するための GNU 拡張機能は実装されていません (p115)。

また、メモリ バリアの組み込みも見つかりませんでした ( __memory_changed()Keil の armcc のように)。

Web や TI フォーラムを検索しても何も見つかりませんでした。

続行する方法について他のヒントはありますか?

4

1 に答える 1

8

メモリバリアはメモリアクセスの順序に関するものですが、値がレジスタにとどまらず、メモリに書き込まれることも保証する必要があります。

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です。)

于 2012-10-17T19:52:47.243 に答える