首先,要了解C中关键字 volatile的功能:
它告诉编译器,它后面所定义的变量为“易失性变量”,随时都有可能被修改,因此编译器必须确保每次使用变量时都要主动从内存中、根据存储变量的地址读取数据,而不是使用寄存器中的缓存值。
所以,宏定义 #define __IO volatile 的作用是将标记为 “__IO” 的变量设置成可读可写的,具有在任何时候均可读写的权限,本质上,它是一个缩写,意味着变量可以在不需要在代码中显式标明 “volatile” 的情况下使用。
ok,上代码,下面是一个简单的延时函数
typedef unsigned int uint32_t;
#define __IO volatile /* defines 'read / write' permissions */
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
首先定义了一个名为 uint32_t 的别名,代表了一个32位无符号整数类型。
然后定义了一个名为 “__IO” 的宏,使用 “__IO” 标记的变量都是被 volatile 修饰的“易失性变量”,在被访问时需要强制读取其在存储器中的最新值。
最后定义延时函数 Delay ,它的形参 nCount 就是一个被标记为 “__IO类型” 的32位无符号整数,函数通过一个for循环来实现延时功能。