簡體   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