I would like to modify a global variable which is shared by different tasks and IRQ contexts in a RTOS. Therefore I need to modify this variable atomically. In my current implementation, I have been using enable_irq/disable_irq functions to modify the statement atomically.
extern int g_var;
void set_bit_atomic(int mask)
{
disable_irq();
g_var |= mask;
enable_irq();
}
I've found the __sync_bool_compare_and_swap
function in GCC documentation as a helper for atomic operations.
My current toolchain is KEIL MDK, and I would like to switch to the approach shown below,
void set_bit_atomic(int mask)
{
volatile int tmp;
do {
tmp = g_var;
} while (!__sync_bool_compare_and_swap(&g_var, tmp, tmp | mask));
}
How can I write __sync_bool_compare_and_swap
function in ARMv4 command set(as inline assembly)?