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変数を最適化させたい場合は有益であり、それを揮発性とマークすることは過度になります。

于 2013-01-22T05:41:25.830 に答える