Jumat, 02 Desember 2011

VARIABEL VOLATILE DALAM C

di pemrograman komputer, khususnya di C, C++ dan C#, suatu variabel atau objek yang dideklarasikan dengan keyword volatile biasanya memiliki properti khusus berkaitan dengan optimalisasi dan/atau threading. dalam bahasa umum, keyword volatile ditujukan untuk mencegah (pseudo) compiler dari penerapan optimalisasi apapun pada kode yang mengasumsikan nilai variabel-variabel tidak dapat berubah “oleh mereka sendiri”
definisi aktual dan aplikabel dari keyword volatile seringkali disalah-artikan dalam konteks bahasa C, dan karena C++, C# dan Java  “mewarisi” volatile dari bahasa C, ada perbedaan besar dalam hal semantik dan penggunaan volatile pada masing-masing bahasa pemrogramman tersebut. maka kita akan membahas konteks keyword volatile dalam C.
dalam bahasa C dan C++, variabel volatile merupakan variabel yang nilainya dapat berubah karena faktor eksternal. dari fakta, hanya ada 3 macam faktor eksternal yang dapat mengubah nilai variabel, yaitu:
  • memory-maped io (baca: alamat memory yang dipetakan untuk io, contoh di mcu 8051 pin 0 memiliki alamat 0x80).
  • variabel global yang nilainya berubah karena interrupt service routine.
  • variabel global dalam aplikasi multi-threaded.
operasi pada variable volatile tidak atomic, dan juga tidak menghasilkan kondisi yang tepat terjadi sebelum hubungan untuk threading. tapi, berdasarkan sebagian besar implementasi saat ini, keyword volatile pada dasarnya adalah keyword berharga untuk konstruksi threading portabel.
memory-maped io (mmio) dalam bahasa C

static int foo;

void bar(void)
{
foo=0;
while(foo != 255);
}

optimasi compiler akan melihat bahwa tidak ada kode lain yang mungkin dapat mengubah nilai yang disimpan dalam variable foo , dan akan mengasumsikan bahwa itu akan tetap bernilai 0 pada setiap saat. maka compiler akan menggantikannya dengan infinite loop seperti ini:

void bar_optimized(void)
{
foo=0;
while(true);
}

namun, variabel foo bisa saja mewakili lokasi yang dapat berubah karena unsur-unsur lain dari sistem komputer setiap saat, seperti register hardware dari device yang terhubung ke cpu . Kode di atas tidak akan mendeteksi perubahan tersebut. tanpa keyword volatile, compiler mengasumsikan bahwa program saat ini satu-satunya bagian dari sistem yang dapat mengubah nilai dari variable foo.
untuk mencegah compiler dari mengoptimalkan kode seperti di atas, kita dapat menggunakan keyword volatile:
static volatile int foo;

void bar(void)
{
foo=0;
while(foo != 255);
}

dengan modifikasi ini, kondisi loop tidak akan dioptimalkan lagi, dan sistem akan mendeteksi perubahan saat terjadi perubahan.

Tidak ada komentar:

Posting Komentar

Related Posts Plugin for WordPress, Blogger...