[英]GCC memory barrier __sync_synchronize vs asm volatile(“”: : :“memory”)
[英]volatile vs memory barrier for interrupts
設x
和y
是主代碼和中斷代碼之間共享的變量。
我對volatile
是,只有並且總是需要硬件變量和中斷變量,這些變量也在主代碼中使用。
通過禁用中斷,主代碼中x
和y
每次使用都保證是原子的。
x
和y
確實需要是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.