gpt4 book ai didi

c - Volatile 是否总是意味着 CPU 寄存器?以及与内存映射的关系

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:24 28 4
gpt4 key购买 nike

我有一些代码

   // Locals to hold pointers to the hardware

static volatile uint32_t *gpio ;
static volatile uint32_t *pwm ;
static volatile uint32_t *clk ;
static volatile uint32_t *pads ;

void setPadDrive (int group, int value)
{
uint32_t wrVal ;

if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
{
if ((group < 0) || (group > 2))
return ;

wrVal = BCM_PASSWORD | 0x18 | (value & 7) ;
*(pads + group + 11) = wrVal ;

if (wiringPiDebug)
{
printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ;
printf ("Read : %08X\n", *(pads + group + 11)) ;
}
}
}

所以从上面来看,CPU 寄存器是内存映射的,并由指针指向。因此,如果我访问这些内存位置,CPU 会看到 volatile,它将重新路由对寄存器的访问。

此外,CPU 如何知道特定的内存位置将路由到哪个寄存器?我是否缺少表明这一点的表格?

最佳答案

不,volatile 意味着 C 编译器不会优化有关变量的代码。当涉及到通过指针与硬件交互时,这绝对是至关重要的。

作为一个非常人为的例子,假设我有一个指针 printer,它被设置为机器将打印存储在其中的任何字节。然后这段代码将打印 aa:

*printer = 'a';
*printer = 'a';

但是,编译器可能认为第二个赋值是不必要的并优化它 - volatile 阻止了这种情况。


在您的特定示例中,机器的设置似乎使特定的内存地址充当寄存器(或寄存器代理)。

关于c - Volatile 是否总是意味着 CPU 寄存器?以及与内存映射的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19279686/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com