私のコンパイラはまだC++ 11とstd :: atomicをサポートしていないので、ldrex-strexペアを使用して手動で実装する必要があります。ARM Cortex M3のint64_tアトミック
私の質問は:ldrexとstrexを使って '原子的に'読んだら変更してint64_tを書き込む正しい方法は何ですか?このような
簡単な解決策は、(STREXWの1が1つのすべての時間を返します)動作していないよう:
volatile int64_t value;
int64_t temp;
do
{
int32_t low = __LDREXW((uint32_t *)&value);
int32_t high = __LDREXW(((uint32_t *)&value)+1);
temp = (int64_t)low | ((int64_t)high<<32);
temp++;
} while(__STREXW(temp, (uint32_t *)&value) | __STREXW(temp>>32, ((uint32_t *)&value)+1));
私は別のアドレスを指しているいくつかの連続LDREXやSTREXの指示については何も見つけることができませんでしたマニュアルはそれが許されるべきだと私には思われました。
そうしないと、複数のスレッドがいくつかのシナリオで2つの異なる原子変数を変更できなくなります。
はGCCですか? GCCの組み込みアトミックを考えてみましょうか? – user3528438
GCC for ARMはstd :: atomicをサポートしました。いいえ、それはGCCではなく、Keil armccです。 – Amomum
参照:[ARM AN321 - Cortex-Mメモリバリア](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHEADII.html)。原子は少しオーバーロードされた単語です。宇宙では物事が原子的に起こることはありません。それらは原子対電子工学のセットです。メインライン/割り込み、SMP、バス上のデバイスなど何が問題ですか?あなたはそれをよりよく説明しなければなりません。 –