C:volatile 和 内存屏障(dmb)

21 篇文章 0 订阅

C语言中 volatile 关键字用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。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()不用在此插入一条串行化汇编指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值