Pertanyaan Volatile dibutuhkan di sini?


Saya memiliki fungsi di mana saya memperbarui struktur, dan juga menonaktifkan interupsi.

bool readBuffer()
{
    __disable_irq();

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

    __enable_irq();

    return true;
}

Karena interupsi dinonaktifkan, tidak mungkin interupsi sebelumnya mengganggu saat memperbarui nilai dalam struktur.

Tetapi haruskah saya juga menandai variabel pembaca sebagai volatile? Karena dalam teori interupsi lain bisa pre-empt ketika saya memasuki fungsi, tetapi tepat sebelum __disable_irq() sebenarnya disebut. Dan ketika fungsi saya dilanjutkan, nilai cache rb->reader akan salah. Atau apakah compiler (GCC) menghasilkan kode yang tidak cache rb->reader sampai baris itu benar-benar terpukul?


4
2018-01-21 15:18


asal


Jawaban:


Mungkin akan lebih baik bagi Anda untuk menentukan penghalang pengoptimalan eksplisit:

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

Ini akan menguntungkan jika dalam beberapa kasus lain Anda ingin kompiler untuk mengoptimalkan rb->reader variabel, dan menandakannya volatile akan demikian berlebihan.


1
2018-01-22 05:41