在嵌入式开发中经常见到这样的关键字 __IO,用来对单片机的IO引脚、寄存器等变量进行声明,通过追踪其定义,发现 __IO实际就是关键字 volative . 如果一个变量声明时候用到关键字volative ,那么以后每次用到该变量都要从其物理地址直接读取,不能利用原来的数据,主要是避免编译器优化的原因和外部造成的变量改变,举例如下:
void divv(int a,b)
{
int c,d;
c=a/b;
d=a/b;
}
这个时候变量c和d的值是完全相同的。
void divv(volative int a,b)
{
int c,d;
c=a/b;
d=a/b;
}
而这段代码c和d的值有可能不同,因为计算C时候取变量a,b;在计算过程中a,b的值有可能被改变,例如是单片机IO口,外部电平信号的改变,造成变量的改变,计算d的时候,由于变量a和b被声明为 volative int型,需要重新读取a、b的值,这种情况下计算出来的d和c就不同了。
总结:
1、如果这个变量需要实时放映物理信号,这种情况下应该声明为 volative ;
2、volative的目的是让编译器生成汇编代码的时候,每次用到该变量都要生成读取该变量的汇编代码,而不是用上一次的值,避免被编译器优化掉。