a136498491 发表于 2015-8-2 20:11:46

不加volatile能使时间变快?想不明白。

基本环境:IAR7.4,野火库,K60F15芯片,跑的鹰眼摄像头采集和LCD显示。另外开了PIT0 10ms 定时,对系统时间这个变量++。
现象
1、不对系统时间这个变量加volatile修饰的时候,把用来打印时间的printf放到PIT中,时间是正常的,而放到主函数大循环中,PIT中只有系统时间++和清中断的语句,时间却变快了大约2倍。
2、考虑到可能是volatile的问题,于是对系统时间加了volatile修饰,结果都正常了。

我想不明白,不加volatile最多是编译器优化掉那句代码,时间变慢或者不变,怎么会变快了?



lingdianhao 发表于 2015-8-2 21:54:58

volatile关键字指示编译器在每一次操作变量时都从其原始地址去取数据。

a136498491 发表于 2015-8-2 23:15:51

lingdianhao 发表于 2015-8-2 21:54
volatile关键字指示编译器在每一次操作变量时都从其原始地址去取数据。

还是不明白为什么会变快,加了volatile就好了,好奇怪。。

unknown 发表于 2015-8-3 09:39:46

建议看看汇编的代码,不用volatile的时候,有可能直接从寄存器取值,这个值到底是什么就不好说了

zhanglei1986145 发表于 2015-8-3 10:13:19

中断中翻转个IO,接个示波器测试一下,从程序层面来看,必须要加 volatile,不过时间查一倍,确实有点蹊跷

xwkm 发表于 2015-8-3 10:14:41

不加volatile编译器会认为部分语句是无用的,会优化掉

jiang887786 发表于 2015-8-3 11:10:17

谢谢搂住分享经验,学习了!

not_at_all 发表于 2015-8-3 11:28:28

你既然用 volatile,就先要知道它用来干什么, 而不是糊里糊涂用了它,然后问别人为什么用了它会变成这样。

a136498491 发表于 2015-8-3 19:51:12

not_at_all 发表于 2015-8-3 11:28
你既然用 volatile,就先要知道它用来干什么, 而不是糊里糊涂用了它,然后问别人为什么用了它会变成这样 ...

不是用了为什么这样,而是不用为什么会这样。用了是正常的,不用是错误的,想不通原因。

ysu533 发表于 2015-8-3 19:56:01

a136498491 发表于 2015-8-3 19:51
不是用了为什么这样,而是不用为什么会这样。用了是正常的,不用是错误的,想不通原因。 ...

还是自己看看这个关键字起什么作用吧。 当年也是碰到程序debug版本运行结果是预期的, release版本的程序结果根本不出来。 那是第一次用到这个关键字。

asj1989 发表于 2015-8-3 20:52:40

那就对了 用这个关键字 就从原始地址读数据,否则有可能被编译器优化掉。

jiwx2011 发表于 2015-8-22 18:09:56

估计是编译器的问题

木君之上 发表于 2015-8-23 19:43:55

volatile影响系统编译的时候对变量的处理方法,中断里面的变量最好用volatile修饰,我亲自做过实验,真的不一样,最好让系统每次都加载数据

leonliu_1128 发表于 2015-8-23 19:58:32

学习了..........
页: [1]
查看完整版本: 不加volatile能使时间变快?想不明白。