我想知道如何有效/正在使用volatile声明。在以下代码中:
volatile char var1 = * (volatile char *) 0x2000000;
printf("%d \n", var1 + 1);
这意味着每次我使用变量" var"时,它将从地址存储器0x2000000加载,但是是必需的固定地址的易失性转换,或者它只适合于var1的类型?
这是否意味着每次" var1"读取,它是从内存中读取,而不是从潜在的缓存值读取?所以在这段代码中,我们访问地址0x2000000的两倍?
答案 0 :(得分:2)
但是必须使用固定地址的易失性演员,(?)
是的,请考虑以下内容。编译器可能会将(char *) 0x2000000
读取一次,无需再次阅读volatile char var2 = * (char *) 0x2000000;
。只需使用之前读取的值并保存在某些内部存储器/寄存器中即可。作为var1/var2
的目标volatile
不会影响作业的右侧。
volatile char var1 = * (char *) 0x2000000;
printf("%d \n", var1);
volatile char var2 = * (char *) 0x2000000;
printf("%d \n", var2);
不需要volatile
volatile char var1
。定义指向volatile
数据的指针可能更符合编码目标。
volatile char *ptr1 = (volatile char *) 0x2000000;
printf("%d \n", *ptr1);
printf("%d \n", *ptr1); // A 2nd read of `(volatile char *) 0x2000000` occurs.
答案 1 :(得分:1)
正如您所写的volatile char var1 = * (volatile char *) 0x2000000;
,这表示创建一个名为var1
的对象(在C实现选择的位置分配)并将其初始化为从0x2000000读取的值。每次读取var1
时,将从实现分配的位置读取复制的值。它不会从0x2000000重新读取。
您可能需要volatile char *var1 = (volatile char *) 0x2000000;
。这将var1
定义为指向0x2000000的指针。根据此定义,每次使用*var1
时,该值都将从0x2000000读取。