我想修改一个由 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 命令集中编写函数(作为内联汇编)?