Volatile在MCU中的显示

    Volatile在MCU主要用来防止编译器对程序优化而导致程序无法实现预期的结果,其一般在MCU中用于定义特殊寄存器、中断函数中使用的变量以及为某些特殊用途的代码定义的变量(如delay功能)。那么加不加volatile的区别在哪里?

     加volatile和不加Volaitle的区别在于加了volatile的变量,程序在获取该变量的具体数值时是直接从内存中获取而不是从cache中获取,这里以合泰的编译生成的汇编指令为例来进行说明:

编译器:HT-IDE3000-7.97

芯片:BS86E16C

代码如下:

如上图所示,当WFTEST分别为0和1时生成的汇编代码如下所示:

上图中作图为WFTEST为0时的汇编代码,而右图的为1,可以看出在右图中,无论对volatile修饰的变量(wftest)是赋值还是取值进行对比,其都是通过_wftest[0]直接获取,而不加volatile的则不是每次调用变量时都直接去读取_wftest[0],而是用a代表变量_wftest[0],对比等操作会使用a而不是_wftest[0],仅在对_wftest[0]进行读写时不使用a。

    因此,在MCU中加volatile的主要作用是保证每次对变量操作是都是直接从变量保存的内存去读取而不是使用MCU的cache,如此保证了每次对变量操作都是与内存中存储的数值真实对应的,而不会产生在实际使用的变量和内存中的变量不一致,个人感觉在MCU中使用volatile可以保证其变量的可见性,即每次使用该变量时均是内存中存储的数值。