以下是运行 Barrelfish 操作系统时使 Pandaboard 上的 LED 闪烁的一些代码。我的问题是,如果从 gpio_oe
和 gpio_dataout
的定义中删除了“volatile”关键字,为什么 LED 不闪烁。
static volatile uint32_t *gpio_oe = (uint32_t *)(GPIO_BASE + 0x0134);
static volatile uint32_t *gpio_dataout = (uint32_t *)(GPIO_BASE + 0x013C);
void led_flash
{
// Enable output
*gpio_oe &= (~(1 << 8));
// Toggle LED on and off till eternity
while(true)
{
*gpio_dataout ^= (1 << 8); // Set means LED on; Clear means LED off
time_delay(); // To give blinking effect
}
}
我知道如果变量的值可以通过程序外部的源自发更改,则需要使用 volatile。但是我在这里看不到这种情况。编译器执行了什么优化使整个 while 循环使 LED 闪烁变得毫无意义?这种优化背后的逻辑是什么,即。这种优化有意义的合法案例?
最佳答案
您还需要 volatile
来强制内存写入和生成的代码访问 volatile
变量的顺序。对于常规变量,编译器可能会决定写入是不必要的,然后丢弃它们或只保留最后一个。
从评论中移出:如果编译器没有看到变量的读取,它可能根本不写任何东西,它甚至可能删除变量。
关于c - 如果以下代码中没有 "volatile"关键字,编译器可以执行什么优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710318/