volatile用法

简介: volatile用法

还有很多搞嵌入式的不知道volatile这个关键字的作用啊。今天我就简单介绍一下。


volatile这个关键字很简单,就是防止编译器被优化,每次使用变量的时候,必须从内存里面取出。用粗俗的话来说就是,一个重复的代码,编译器可能会认为这个代码没有多次重复的意义,从而将这部分代码进行优化。


举个例子,很多时候,单片机的延时程序是根据一个变量不断减少实现的。以下为一个闪烁的灯光程序。


void delay(int time)  //假设这是一个延时0.5s的程序
{
    long long i;
    while(time--)
    {
        for{i=0xFFFFFFFFFFFFFFFF;i<1;i--};
    }
}
void main()
{
    while(1)
    {
        delay(2);
        P1^1=0;
        delay(2);
        P1^1=1;
    }
}


正常情况下,这个灯光会间隔一秒一闪一闪的。但是当这个程序写入单片机的时候,我们会发现,灯光一直亮着啊。这是什么原因呢?

很可能是因为这个i--的过程被编译器优化了。导致这个延时并不准确,做不到真正的0.5s延时。这个时候我们应该怎么做呢?就可以用volatile了。

void delay(int time)  //假设这是一个延时0.5s的程序
{
    volatile long long i;
    while(time--)
    {
        for{i=0xFFFFFFFFFFFFFFFF;i<1;i--};
    }
}
void main()
{
    while(1)
    {
        delay(2);
        P1^1=0;
        delay(2);
        P1^1=1;
    }
}


这个时候,又有人会说了,我从来没有见到过volatile这个关键字啊。一点都不常用。但凡多用过几次stm32就不会这么说了,我们写stm32的程序的时候,能经常看见__IO这个关键词,而__IO你查看他的定义,发现他是这么写的。

#define     __IO    volatile                  /*!< defines 'read / write' permissions   */
目录
相关文章
|
3天前
|
缓存 Java 编译器
volatile原理
volatile原理
22 1
|
9月前
|
安全 Java 编译器
Volatile关键字的作用和实现原理
Volatile关键字的作用和实现原理
129 0
|
9月前
|
存储 缓存 Java
volatile 关键字 (详细解析)
volatile 关键字 的工作原理: 1、子线程t 和 main方法从主内存读取到数据放入其对应的工作内存,此时 flag的值为false 2、子线程t 将flag的值更改为true 3、在某一时刻 子线程t将flag的值写回主内存后,失效其他线程对此变量副本 4、main方法 再次对flag进行操作的时候线程会从主内存读取最新的值,放入到工作内存中
135 0
|
10月前
|
安全 Java 编译器
volatile 与 synchronized 关键字的区别?
volatile 与 synchronized 关键字的区别?
43 0
|
10月前
|
缓存 Java 调度
volatile 原理
volatile 原理
|
存储 缓存 Java
volatile关键字解析
volatile关键字解析
145 0
volatile关键字解析
|
算法 安全 Java
多线程之volatile关键字
多线程之volatile关键字
|
Java
volatile关键字的作用
volatile关键字的作用
125 0
volatile关键字的作用
|
存储 缓存 Java
Java并发编程之Volatile关键字解析
在java的并发编程中我们经常会使用到Volatile关键字。而关于Volatile关键字的使用以及Volatile关键字的特性和实现原理也是在笔面试中经常会遇到的问题了。
81 0
Java并发编程之Volatile关键字解析
|
缓存 Java 编译器
Java并发编程学习笔记:volatile关键字解析
Java并发编程学习笔记:volatile关键字解析