寄存器使用 volatile
Use of volatile for registers
我想知道 volatile 声明的效率如何。在以下代码中:
volatile char var1 = * (volatile char *) 0x2000000;
printf("%d \n", var1 + 1);
意思是我每次使用变量"var",都会从地址内存0x2000000加载,但是固定地址的volatile转换是必要的,还是只适合类型var1 的?
这是否意味着每次读取 "var1" 时,它都是从内存中读取的,而不是从潜在的缓存值中读取的?所以在这段代码中,我们访问了两次地址 0x2000000?
but is the volatile cast of a fixed address necessary, (?)
是的,请考虑以下内容。编译器可以推断 (char *) 0x2000000
被读取了一次,不需要为 volatile char var2 = * (char *) 0x2000000;
再次读取。只需使用之前读取并保存在某个内部 memory/register 中的值。目标 var1/var2
,即 volatile
,不影响分配的 right-hand-side。
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.
如您所写,volatile char var1 = * (volatile char *) 0x2000000;
,这表示创建一个名为 var1
的对象(分配在 C 实现选择的位置)并将其初始化为从 0x2000000 读取的值。每次读取 var1
时,将从实现分配的位置读取复制的值。不会从0x2000000重新读取。
您可能想要 volatile char *var1 = (volatile char *) 0x2000000;
。这将 var1
定义为指向 0x2000000 的指针。使用此定义,每次使用 *var1
时,将从 0x2000000.
读取值
我想知道 volatile 声明的效率如何。在以下代码中:
volatile char var1 = * (volatile char *) 0x2000000;
printf("%d \n", var1 + 1);
意思是我每次使用变量"var",都会从地址内存0x2000000加载,但是固定地址的volatile转换是必要的,还是只适合类型var1 的?
这是否意味着每次读取 "var1" 时,它都是从内存中读取的,而不是从潜在的缓存值中读取的?所以在这段代码中,我们访问了两次地址 0x2000000?
but is the volatile cast of a fixed address necessary, (?)
是的,请考虑以下内容。编译器可以推断 (char *) 0x2000000
被读取了一次,不需要为 volatile char var2 = * (char *) 0x2000000;
再次读取。只需使用之前读取并保存在某个内部 memory/register 中的值。目标 var1/var2
,即 volatile
,不影响分配的 right-hand-side。
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.
如您所写,volatile char var1 = * (volatile char *) 0x2000000;
,这表示创建一个名为 var1
的对象(分配在 C 实现选择的位置)并将其初始化为从 0x2000000 读取的值。每次读取 var1
时,将从实现分配的位置读取复制的值。不会从0x2000000重新读取。
您可能想要 volatile char *var1 = (volatile char *) 0x2000000;
。这将 var1
定义为指向 0x2000000 的指针。使用此定义,每次使用 *var1
时,将从 0x2000000.