以下是运行 Barrelfish 操作系统时使 Pandaboard 上的 LED 闪烁的一些代码。gpio_oe
我的问题是,如果从and的定义中删除了 'volatile' 关键字,为什么 LED 不闪烁gpio_dataout
。
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 变得毫无意义?这种优化背后的逻辑是什么,即。这种优化有意义的合法案例?