構造を更新し、割り込みを無効にする関数があります。
bool readBuffer()
{
__disable_irq();
rb->reader += 1; // Just an example
__enable_irq();
return true;
}
割り込みが無効になっているため、構造内の値を更新している間に別の割り込みが横取りされることはありません。
しかし、リーダー変数もマークする必要がありvolatileますか? 理論的には、関数に入るときに他の割り込みがプリエンプトされる可能性があるため、__disable_irq()実際には直前に呼び出されます。関数が再開すると、キャッシュされた値rb->readerが正しくなくなります。rb->readerまたは、コンパイラ (GCC) は、その行が実際にヒットするまでキャッシュしないコードを生成しますか?