volatile和 memory barrier

volatile

 

c语言中 volatile 关键字用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。volatile只能保证编译器不会做乱序执行优化.

 

      1. 不对*p操作生成乱序指令(通常如此,具体请看后面的解释)

(比如条件判断)

 

      2. 每次从*p取数据的时候,一定会进行一次访存操作,哪怕前面不久才取过*p的值放在寄存器里。

比如对于硬件寄存器的访问,内存中的数据和cache中的数据可能不一致.

 

      3.不合并对*p的写操作(也只是通常如此,解释见后)

int *p;

volatile int *p1;

p = 1;  //这个被优化

p = 2;

p1 = 1;  //这个不会

p1 = 2;

但volatile无法保证 cpu运行时乱序执行.

 

内存屏障(memory barrier)


如果要想控制cpu运行是乱序执行优化则需有内存屏障.

 

 

#define isb() __asm__ __volatile__ ("isb" : : : "memory")

#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")

#define dmb() __asm__ __volatile__ ("dmb" : : : "memory")

 

 

#define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)

#define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)

#define wmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)

 

#define set_mb(var, value) do { var = value; mb(); } while (0)

      1. set_mb(),mb(),barrier()函数追踪到底,就是__asm__ __volatile__("":::"memory"),而这行代码就是内存屏障。
      2. __asm__用于指示编译器在此插入汇编语句
      3. __volatile__  相当于 C语言的volatile(见上面分析).
      4.  memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。
      5)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值