OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6092|回复: 3

Volatile 局部变量

[复制链接]

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-29
在线时间
0 小时
发表于 2013-11-6 11:03:49 | 显示全部楼层 |阅读模式
见到一个旧程序,在函数内部的局部变量加上了Volatile.

局部变量不是在堆栈上分配吗,每次调用函数,都会在堆栈上对局部变量重新分配栈内存空间吧.
这样的局部变量volatile有意义吗?

这个局部变是用一个全局变量给赋值的,然后在函数内部参与运算.

有人能分析一下吗







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2013-11-6 17:01:03 | 显示全部楼层
volatile只是告诉编译器,这个变量是挥发性的,每次<访问>必须<认认真真>的<读取-修改-写>到实际位置,而不能偷懒.

这不单单用在别的地方会修改的场合,还可以用于通知编译器不要优化某个变量.

比如

void delay(void)
{
    uint32 i = 0;
    for(i = 0; i < 100; i ++)
    {
    }
}

上面的i,在一些编译器,或者一些编译选项上,是可以被优化的,因为这个i没有输出操作,编译器为了提高运行速度把整个循环删掉是符合规定的,但这不是我们需要的结果.

如果声明成
    volatile uint32 i = 0;

编译器就不会优化这个变量,它不管是否外部是否<真的>会修改,都会乖乖的执行所有关于i的操作.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-29
在线时间
0 小时
 楼主| 发表于 2013-11-6 20:14:09 | 显示全部楼层
回复【2楼】shihantu:
---------------------------------
谢谢,但我看到的应用没有这样的用法.而且,这样的For循环编译器会删除掉吗? 
应该是需要手工的设置一些优化选项吧,Default的编译器设置,应该不会被删掉.
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2013-11-6 20:32:30 | 显示全部楼层
回复【3楼】ivory:
---------------------------------
举例而已.

不同的编译器默认优化不一定是不优化,如Keil的默认优化是-O2,而不是-O0.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表