RTOS のさまざまなタスクと IRQ コンテキストによって共有されるグローバル変数を変更したいと考えています。したがって、この変数をアトミックに変更する必要があります。私の現在の実装では、ステートメントをアトミックに変更するために enable_irq/disable_irq 関数を使用しています。
extern int g_var;
void set_bit_atomic(int mask)
{
disable_irq();
g_var |= mask;
enable_irq();
}
アトミック操作のヘルパーとして、__sync_bool_compare_and_swap
GCCドキュメントの関数を見つけました。
私の現在のツールチェーンは KEIL MDK ですが、以下に示すアプローチに切り替えたいと考えています。
void set_bit_atomic(int mask)
{
volatile int tmp;
do {
tmp = g_var;
} while (!__sync_bool_compare_and_swap(&g_var, tmp, tmp | mask));
}
__sync_bool_compare_and_swap
ARMv4 コマンド セットで (インライン アセンブリとして) 関数を記述するにはどうすればよいですか?