使用volatile作为寄存器

时间:2018-02-28 22:50:42

标签: c volatile

我想知道如何有效/正在使用volatile声明。在以下代码中:

volatile char var1 = * (volatile char *) 0x2000000;
printf("%d \n", var1 + 1);

这意味着每次我使用变量" var"时,它将从地址存储器0x2000000加载,但是是必需的固定地址的易失性转换,或者它只适合于var1的类型?

这是否意味着每次" var1"读取,它是从内存中读取,而不是从潜在的缓存值读取?所以在这段代码中,我们访问地址0x2000000的两倍?

2 个答案:

答案 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读取。