求助一下C语言中的volatile作用

2019-07-21 08:25发布

我发现stm32f10x.h文件里进行了宏定义#define     __O     volatile                  /*!< defines 'write only' permissions     */#define     __IO    volatile                  /*!< defines 'read / write' permissions   */
但是通过网上查询对volatile没有太明白,想请问一下各位有没有什么简单的理解方式,我不要求太深入、太专业,只要能让我这个新人简单明白大概的作用即可,能举出例子更好。
非常感谢各位的教导!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
warship
1楼-- · 2019-07-22 13:43
ssssssssssss 发表于 2018-8-10 08:30
也就是说优化等级为0,也会出现这种优化吗

0级优化:

这种优化是很基本的,
你先要明白,我们虽然只是简单的给某变量赋值,
生成汇编代码时往往都需要通用寄存器作为中介的。
i=10汇编后的代码写成C语言相当于:R0=10; R1=i的地址; 然后STR R0,(R1)
就是这么费劲的,然后你马上又来一句j=i;  它会傻到再去取i的值吗? 直接就用R0中现存的值了。
ssssssssssss
2楼-- · 2019-07-22 15:32
本帖最后由 ssssssssssss 于 2018-8-10 09:16 编辑
warship 发表于 2018-8-10 09:05
这种优化是很基本的,
你先要明白,我们虽然只是简单的给某变量赋值,
生成汇编代码时往往都需要通用寄 ...


比如说一个变量count值(不加volatile),执行下面的函数  count=1; count=3;count=GPIO_IDR;count=6;5ms定时器中断里面我让count++;(假设GPIO_IDR值是0x09),定时器跑完一次定时器中断的时候count变量可能是多少?
SimpleLife
3楼-- · 2019-07-22 17:01
本帖最后由 SimpleLife 于 2018-8-10 09:17 编辑

volatile作用:无论何时,编译器读取变量都从地址上读取。
情况:在某些编译器下,编译器优化读取方式,若某段时间内程序没有对变量进行改变,编译器读取的值为上次的值。
例子:
PA5,在某段时间内,程序没有对PA5进行设置,在下次读取时,编译器会自动把上个值直接读取出来,
如果PA5是输入口,电平改变了,编译器是不知道的,读取的只能为上次读取的值,
这个时候volatile的作用提现出来了:无论何时,读取变量都从地址上读,这样保证了读取到的值是实时的,准确的。
ssssssssssss
4楼-- · 2019-07-22 19:03
 精彩回答 2  元偷偷看……
SimpleLife
5楼-- · 2019-07-22 22:54
百度上也有很多说明啦
warship
6楼-- · 2019-07-23 00:56
ssssssssssss 发表于 2018-8-10 09:14
比如说一个变量count值(不加volatile),执行下面的函数  count=1; count=3;count=GPIO_IDR;count= ...

这种赋值语句不说明问题,
我认为编译出来,会以最后一次为准,
即count=6

一周热门 更多>