易失性与内存屏障的中断

时间:2019-06-27 12:49:19

标签: c interrupt atomic volatile memory-barriers

xy是在主代码和中断代码之间共享的变量。

我对volatile的想法是,对于并且也在主代码中使用的硬件变量和中断变量,它始终是唯一需要的。

通过禁用中断,可以保证主代码中xy的每次使用都是原子的。

真的需要xyvolatile,还是在使用它们强制从RAM重新加载变量之前设置一个内存屏障?

A)

volatile bool x;
volatile int y[100];

int main(void)
{

        while (true) {
                disable_interrupts();
                if (x)
                        work(y);
                x = false;
                enable_interrupts();
        }
}

B)

bool x;
int y[100];

int main(void)
{

        while (true) {
                memory_barrier();
                disable_interrupts();
                if (x)
                        work(y);
                x = false;
                enable_interrupts();
        }
}

目标是:

  • 让编译器优化work()

  • 能够使用诸如memcpy()之类的标准库函数(未与volatile变量一起使用)。

编辑:添加中断示例

interrupts.c

extern volatile? int x;
extern volatile? int y;

void interrupt(void)
{

        x = true;
        REGY1 = y[7];
        y[23] = REGY2;
}

1 个答案:

答案 0 :(得分:2)

使用内存屏障代替volatile很好。 Linux内核开发人员prefer it that way

需要注意一些事情。

  • 在禁用中断后移动屏障。中断往往发生在最坏的时候。
  • 对于在主程序中写入并在中断处理程序中读取的变量,启用中断之前,您需要第二个内存屏障。
  • 在多处理器/多核系统中禁用中断是不够的,它不能阻止另一个核运行。
  • 不用说,不应长时间禁用中断,因为它会阻止某些硬件驱动程序运行。