还有很多搞嵌入式的不知道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 */