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

发布者:幸福如愿最新更新时间:2019-11-21 来源: 51hei关键字:C语言  关键字  volatile 手机看文章 扫描二维码
随时随地手机看文章

我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的使用。举例如下:

view plaincopy to clipboardprint?
1.struct task_struct {  
2.volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */  
3.void *stack;  
4.atomic_t usage;  
5.unsigned int flags;     /* per process flags, defined below */  
6.unsigned int ptrace;  
7........  
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,要到内存中去重新取值。

关键字:C语言  关键字  volatile 引用地址:你了解C语言中的关键字volatile吗?

上一篇:学习笔记—S3C2440的内存管理器
下一篇:三星S3C2440的GPIO输出驱动led

推荐阅读最新更新时间:2024-11-08 11:15

C语言和汇编语言在开发单片机时各有哪些优缺点?
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。 C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆
[单片机]
Volatile的理解
Volatile 字面的意思时易变的,不稳定的。 编译器在优化代码时,可能会把经常用到的代码存在Cache里面,然后下一次调用就直接读取Cache而不是内存,这样就大大提高了效率。但是问题也随之而来了。 在多线程程序中,如果把一个变量放入Cache后,又有其他线程改变了变量的值,那么本线程是无法知道这个变化的。它可能会直接读Cache里的数据。但是很不幸,Cache里的数据已经过期了,读出来的是不合时宜的脏数据。这时就会出现bug。也就是说如果它是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。 用Volatile声明变量可以解决这个问题。用Volatile声明的变
[单片机]
C语言访问MCU寄存器的两种方式
单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有两种方法。 1、采用标准C的强制类型转换和指针来实现 采用标准C的强制转换和指针的概念来实现访问MCU的寄存器,例如: #define DDRB (*(volatile unsigned char *)0x25) 分析如下: A:(unsigned char *)0x25中的0x25只是个值,前面加(unsigned char *)表示0x25是个地址,而且这个地址所存储的数据的数据类型是unsigned char,意思就是说读/写这个地址时,要写进unsigned char的值,读出也是unsigned char的值。 (
[单片机]
51单片机多机通信电路图及C语言程序
多机通信电路图 此处,U1作为主机,U2为从机1,U3为从机2。 多机通信C语言程序 (1)主机程序 #include #include #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned charTable ={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff ; //数据缓冲区 unsigned char temp=0xff; sbit KEY1=P1^6; sbit KEY2=P1^7; //unsigned char addr; //延时1ms函数 void de
[单片机]
51单片机多机通信电路图及<font color='red'>C语言</font>程序
单片机c语言基础知识,c语言必背的100代码
我记得刚开始接触编程的时候,觉得太难了。 也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧? 他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会有影响。 一个程序几千行,错一个标点符号都不行这也太难了吧? 带着新手的灵魂拷问,作为从业单片机编程10年的开发者,我来为大家拨开云雾。 看完以后你就会明白,其实他们也没那么厉害!即便你是初中文凭,也照样能编程。 对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已。 你所看到的那些几千甚至上万行的代码,都是用这些语句和关键词来重复编写的。 只是他们逻辑功能不一样,另外的那些英文,都是程序员自己起的,比如说一些变量的名字,函数的
[单片机]
单片机c语言字符串操作
字符串转int atoi 函数原型int atoi(const char *nptr); int val = atoi( 12 ); 这样va就l等于12 int转字符串 itoa 函数原型:char*itoa(intvalue,char*string,intradix); int number=123456; char string ; itoa(number,string,10); string就是123456 后面的10是说转化成10进制 16就是转化成16进制 8就是转化成8进制 ,也可以转化成2进制 字符串截取 strncpy 原型:char*strncpy(char*dest,char*src,size_tnum);
[单片机]
利用proteus学习ARM(LPC2103)之二:熟悉IAR C语言开发环境
1. 关于C语言中数据类型的长度问题 我们应该比较熟悉51系列的C语言数据类型的长度,如下表所示: 数据类型 长 度 值 域 unsigned char 单字节 0~255 signed char 单字节 -128~+127 unsigned int 双字节 0~65535 signed int 双字节 -32768~+32767 unsigned long 四字节 0~429
[单片机]
c语言在单片机开发中的应用
单片机的开发应用中,已逐渐开始引入高级语言, C 语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言 ’ 可控性 ’ 不好,不如汇编那样随心所欲。但是只要我们掌握了一定的 C 语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学 C51 者有所帮助。 一、 C51 热启动代码的编制 对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位 ( 如 0x7f 位和 0x7e 位 ) ,启动时首先读该内存
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved