«

»

Aug 08

Meng-akses Variabel Volatile

Terdapat hal yang perlu diperhatikan ketika menggunakan variabel yang di-share antara Interrupt Service Routine (ISR) dan program utama. Ketika ISR dipicu ketika interupsi di-enable, kita perlu memperhatikan bagaimana meng-akses shared variable tersebut.

Sebuah variabel harus diberi prefix volatile bila digunakan di dalam ISR dan di luarnya.

  • Variabel yang hanya digunakan di luar ISR, tidak perlu volatile.
  • Variabel yang hanya digunakan di dalam ISR, tidak perlu volatile.
  • Variabel yang digunakan di dalam dan di luar ISR, harus volatile.

Memberi prefix volatile akan memberitahu compiler untuk tidak meng-cache isi variabel ke dalam register prosesor, namun selalu membacanya dari memori, bila diperlukan. Hal ini akan memperlambat pemrosesan, dan untuk itu, jangan menggunakan volatile bila memang tidak diperlukan.

Perhatikan kode program berikut:

volatile byte count;

ISR (TIMER1_OVF_vect)
{
  count = 10;
}

void setup ()
{
}

void loop () 
{
  count++;
}

Terdapat kondisi berbahaya dimana nilai count++ sementara pada saat bersamaan (bisa terjadi demikian), nilai count = 0 dalam ISR.

Kita perlu mem-proteksi shared variable dengan mematikan interupsi ketika terjadi perubahan di program utama:

volatile byte count;

ISR (TIMER1_OVF_vect)
{
  count = 10;
}

void setup ()
{
}

void loop () 
{
  noInterrupts();
  count++;
  interrupts();
}