4

我有一个更新结构并禁用中断的功能。

bool readBuffer()
{
    __disable_irq();

    rb->reader += 1; // Just an example

    __enable_irq();

    return true;
}

因为中断被禁用,在我更新结构中的值时,另一个中断不可能抢占。

但是我是否也应该将阅读器变量标记为volatile?因为理论上另一个中断可以在我进入函数时抢占,但__disable_irq()实际上是在之前被调用。当我的功能恢复时,缓存的值rb->reader将不正确。rb->reader还是编译器(GCC)生成的代码在实际命中该行之前不会缓存?

4

1 回答 1

1

指定显式优化障碍可能会更好:

bool readBuffer()
{
    __disable_irq();
    asm volatile ("" ::: "memory"); // Some unexpected memory modification
    rb->reader += 1; // Just an example
    __enable_irq();
    return true;
}

如果在某些其他情况下您希望编译器优化rb->reader变量,并且将其标记为 volatile 将因此过度,这将是有利可图的。

于 2013-01-22T05:41:25.830 回答