一 查查字典
volatile 易失的 ,可变的 ,挥发性的,不稳定的
二 查C语言语法
A volatile variable is one whose value may be change outside the normal program flow
在正常的程序之外有可能发生改变的一种变量
什么叫正常的程序流程:
我们用int 用 char 类型声明一个变量,这个变量给他赋了个值等于3或者等于5,如果程序往下执行的语句当中,没有再给变量再赋新值 ,是不是这个变量的不会变,他应该还是3 还是5,否则就出问题了对吧
可是寄存器不是这样的的
寄存器(比如 GPIOD_PDIR寄存器)他的值不是一个数值或者一个变量 ,他是一个地址映射像一个储存空间,但他并不是存储器,他的值是电路,外面接的是引脚,他反应的是外面的引脚接了一个按键,被按下或者没有按下,电压是高还是低,他的值是跟着外部电路变的。
所以如果我们 写一句话,对外部的输入引脚,读他的值,检测外面的按键有没有被按下,然后循环一段时间再读一次
(定时检查有没有按下 这个键) 把这句话写在代码中,功能是非常清晰的,如果c语言他的编译器不知道这是一个 Volatile
(或者说是一个寄存器)那么把编译器的优化选项打开(开到最高一档的优化)就是让我们的代码尽可能的简短,用的空间尽可能的小,执行的速度尽可能的块,然后编译器就会非常smart的认为这个变量,这个人为什么没有在给变量赋新值的时候读他一下,然后delay 一段时间又读他一下,那一个变量没有赋新值,读他两下这个浪费时间的操作编译器就会把他优化掉,
这个时候如果看编译器生成的汇编代码,只剩下了读取一次,于是程序运行就不正常了
所以使用valotile 关键字,放在变量的前面
volatile char value;