首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

你了解C语言中的关键字volatile吗?

你了解C语言中的关键字volatile吗?

你了解C语言中的关键字volatile吗?
我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的使用。举例如下:
view plaincopy to clipboardprint?
struct task_struct {   
        volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */   
        void *stack;   
        atomic_t usage;   
        unsigned int flags;     /* per process flags, defined below */   
        unsigned int ptrace;   
.......  
struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace; .......
       在应用程序中,volatile主要是被设计用来修饰被不同线程访问和修改的变量。
       volatile的变量是说这变量可能会被意想不到地改变,因此编译器不要进行相应的优化。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
      例如:
      extern int a;//语句1  假设a是一个全局变量
     ......
      int b=a; //语句2
      int c=a;  //语句3
语句2与语句3中都使用了a的值,优化器在语句3中引用a的值时,认为语句2中已经将a的值读到寄存器中了,并且在语句2与语句3之间没有对a进行修改,因此没必要再到内存中去读a的值,所以直接使用了寄存器中的值。但是如果在语句3执行前,产生了中断,中断恰好对a进行了修改。那么语句3取出来的值就有问题了。
      如果上面的全局变量a是被修饰为volatile的话,那么优化器就不能去优化语句3,要到内存中去重新取值。

     作为嵌入式系统程序员,volatile一定要知道如何使用。

【深圳信盈达嵌入式实训学院】,单片机培训、嵌入式ARM培训、linux培训、PCB培训、FPGA培训,汇编C语言培训、Android培训、数电模电培训、cortex-m3培训!

免费试学,满意再报名。实力验证一切!

技术咨询:张老师15361421563  QQ1924786560

用芯设计,用心服务,深圳信盈达实训学院!
先学习后付款,入学签定就业协议,包学会包就业!
帮您快速掌握技能,圆你工程师梦想!
免费试听所有课程,满意后再报名!
人性化课程设计,根据学员要求和学习情况,灵活开展课程!
名师与你分享自己的成长历程,让您少走弯路,直达工程师殿堂!
由具有多年丰富开发经验的资深导师手把手教学,20%理论+60%实操+20%项目开发!
返回列表