繁体   English   中英

中断的易失性与内存屏障

[英]volatile vs memory barrier for interrupts

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

我对volatile是,只有并且总是需要硬件变量和中断变量,这些变量也在主代码中使用。

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

xy确实需要是volatile ,还是在使用它们强制从RAM重新加载变量之前是否足以放入内存屏障?

一种)

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;
}

内存障碍而volatile很好。 Linux内核开发人员更喜欢这种方式

有几点需要注意。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM