您当前的位置:五五电子网电子知识单片机-工控设备源码-程序单片机中volatile变量定义的作用 正文
单片机中volatile变量定义的作用

单片机中volatile变量定义的作用

点击数:7833 次   录入时间:03-04 11:43:15   整理:http://www.55dianzi.com   源码-程序

    >>>>注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:

    >>>>首先,用classwizard建一个win32 console工程,插入一个voLTEst.cpp文件,输入下面的代码:

    >>

    #include <stdio.h>

    void main()

    {

    int i=10;

    int a = i;

    printf("i= %d",a);

    //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道

    __asm {

    mov dword ptr [ebp-4], 20h

    }

    int b = i;

    printf("i= %d",b);

    }

    然后,在调试版本模式运行程序,输出结果如下:

    i = 10

    i = 32

    然后,在release版本模式运行程序,输出结果如下:

    i = 10

    i = 10

    输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。下面,我们把 i的声明加上volatile关键字,看看有什么变化:

    #include <stdio.h>

    void main()

    {

    volatile int i=10;

    int a = i;

    printf("i= %d",a);

    __asm {

    mov dword ptr [ebp-4], 20h

    }

    int b = i;

    printf("i= %d",b);

    }

    分别在调试版本和release版本运行程序,输出都是:

    i = 10

    i = 32

    这说明这个关键字发挥了它的作用!

    volatile对应的变量可能在你的程序本身不知道的情况下发生改变

    比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量

    你自己的程序,是无法判定合适这个变量会发生变化

    还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。

    对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

    典型的例子

    for ( int i=0; i<100000; i++);

    这个语句用来测试空循环的速度的

    但是编译器肯定要把它优化掉,根本就不执行

    如果你写成

    for ( volatile int i=0; i<100000; i++);

    它就会执行了



上一页  [1] [2] 


本文关键字:单片机  源码-程序单片机-工控设备 - 源码-程序