b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

tms320f2812_tms320f2812有哪些外设_tms320f2812的并行机制(10)

电脑杂谈  发布时间:2017-04-03 05:09:36  来源:网络整理

自己无法知道,volatile就是告诉编译器这种情况。



2 不做常量合并、常量传播等优化,所以像下面的代码:

volatile int i = 1;

if (i > 0) ...



if的条件不会当作无条件真。



3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值***作,然而对Memory Mapped

IO的处理是不能这样优化的。



前面有人说volatile可以保证对内存***作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。



对于jiffies,它已经声明为volatile变量,我认为直接用jiffies++就可以了,没必要用那种复杂的形式,因为那样也不能保证原子性。



你可能不知道在Pentium及后续CPU中,下面两组指令



inc jiffies

;;

mov jiffies, %eax

inc %eax

mov %eax, jiffies



作用相同,但一条指令反而不如三条指令快。

现举例说明(以Keil-c与a51为例

例子来自Keil FQA),看完例子后你应该明白volatile的意思了,如果还不明白,那只好

再看一遍了。

例1.

void main (void)

{

volatile int i;

int j;

i = 1; //1 不被优化 i=1

i = 2; //2 不被优化 i=1

i = 3; //3 不被优化 i=1

j = 1; //4 被优化

j = 2; //5 被优化

j = 3; //6 j = 3

}

---------------------------------------------------------------------

例2.

函数:

void func (void)

{

unsigned char xdata xdata_junk;

unsigned char xdata *p = &xdata_junk;

unsigned char t1, t2;

t1 = *p;

t2 = *p;

}

编译的汇编为:

0000 7E00 R MOV R6,#HIGH xdata_junk

0002 7F00 R MOV R7,#LOW xdata_junk

;---- Variable 'p' assigned to Register 'R6/R7' ----

0004 8F82 MOV DPL,R7

0006 8E83 MOV DPH,R6

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 注意

0008 E0 MOVX A,@DPTR

0009 F500 R MOV t1,A

000B F500 R MOV t2,A

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

000D 22 RET

将函数变为:

void func (void)

{

volatile unsigned char xdata xdata_junk;

volatile unsigned char xdata *p = &xdata_junk;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-39167-10.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...