结构体里的volatile是什么意思

slisent 2008-09-10 03:07:21
#pargma SBATA pw_timer
struct{
uchar volatile f_delay :1;
uchar dummy :7;
}pw_timer;
烦请问下,这里结构体里的volatile是什么意思?

这段程序,我是只想用到pw_timer里的一位,其它七位都不用.
请问,以上程序正确否?
...全文
821 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_sharp 2008-09-10
  • 打赏
  • 举报
回复
UP
slisent 2008-09-10
  • 打赏
  • 举报
回复
谢谢楼上各位的解答了
LiTuX 2008-09-10
  • 打赏
  • 举报
回复
csdn果然人才济济,得,我基本上没的说了……

lbh2001 2008-09-10
  • 打赏
  • 举报
回复
若只用一位,干脆其他的匿名
#pargma SBATA pw_timer
struct
{
uchar volatile f_delay :1;
uchar :7;
}pw_timer;

在程序外会改变的意思
比如那位代表端口,时钟等,直接由外部改变
不一定受你程序的控制
xkyx_cn 2008-09-10
  • 打赏
  • 举报
回复
volatile 的含义
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,它有下面的作用:

1 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器 自己无法知道,volatile就是告诉编译器这种情况。

2 不做常量合并、常量传播等优化,所以像下面的代码:
volatile int i = 1;
if (i > 0) ...

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

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

slisent 2008-09-10
  • 打赏
  • 举报
回复
可我只要用到一位,就相当于,我一直都只需用1位
这是不是就代表在程序外不会改变啊?

还是说,我用的那个位是用来做标志位,所以它有0和1两种情况
那就代表它在程序外会改变?

我就是不大明白,在程序外会改变的意思
mifeixq 2008-09-10
  • 打赏
  • 举报
回复
避免编译器优化
xkyx_cn 2008-09-10
  • 打赏
  • 举报
回复
volatile 表示这个变量可能会在程序外改变,另外volatile修饰的变量不会进入cache

应该可以达到你的要求

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧