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   */
目录
相关文章
|
6月前
|
缓存 安全 Java
《volatile使用与学习总结:》多层面分析学习java关键字--volatile
《volatile使用与学习总结:》多层面分析学习java关键字--volatile
35 0
|
3月前
|
存储 缓存 Java
volatile关键字最全原理剖析
【9月更文挑战第27天】`volatile` 是一个用于修饰变量的关键字,告知编译器被修饰的变量可能在程序控制流之外被改变。在多线程环境下,`volatile` 确保变量的值每次从内存中读取,保持最新状态,但不能解决所有同步问题。在硬件交互中,`volatile` 用于内存映射的 I/O 操作,确保读取最新值。不同编程语言如 C/C++ 和 Java 中的 `volatile` 用法略有差异,但都是处理易变变量的重要工具。
|
6月前
|
Java
volatile关键字的作用
volatile关键字的作用
38 0
|
安全 Java 编译器
Volatile关键字的作用和实现原理
Volatile关键字的作用和实现原理
190 0
|
存储 缓存 Java
volatile 关键字 (详细解析)
volatile 关键字 的工作原理: 1、子线程t 和 main方法从主内存读取到数据放入其对应的工作内存,此时 flag的值为false 2、子线程t 将flag的值更改为true 3、在某一时刻 子线程t将flag的值写回主内存后,失效其他线程对此变量副本 4、main方法 再次对flag进行操作的时候线程会从主内存读取最新的值,放入到工作内存中
162 0
|
安全 Java 编译器
volatile 与 synchronized 关键字的区别?
volatile 与 synchronized 关键字的区别?
56 0
|
存储 缓存 Java
volatile关键字解析
volatile关键字解析
182 0
volatile关键字解析
|
存储 缓存 Java
Java并发编程之Volatile关键字解析
在java的并发编程中我们经常会使用到Volatile关键字。而关于Volatile关键字的使用以及Volatile关键字的特性和实现原理也是在笔面试中经常会遇到的问题了。
112 0
Java并发编程之Volatile关键字解析
|
缓存 Java 编译器
Java并发编程学习笔记:volatile关键字解析
Java并发编程学习笔记:volatile关键字解析
|
缓存 Java 编译器
Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析
139 0
Java并发编程:volatile关键字解析