Volatile Bahasa C dan Fungsinya Tahap 2
- Variabel global dimodifikasi oleh pelayanan rutinitas interrupt dari luar scope: contoh, sebuah variabel global dapat merepresentasikan sebuah port data, biasanya berupa pointer global seperti pemetaan memori OP yang dilakukan pembaruan secara dinamis. Data yang membaca port kode harus dideklarasikan sebagai volatile dengan tujuan untuk mengambil data terakhir yang tersedia pada port. Jika mengalami kegagalan dalam pendeklarasian variabel volatile, maka kompilator akan mengomptimisasi kode program sedemikian rupa yang akan membaca port sekali saja dan menjaganya dengan menggunakan nilai yang sama pada register sementara untuk meningkatkan kecepatan program (speed optimization). Secara umum, ISR digunakan untuk melakukan pembaruan data port ketika terdapat interrupt terhadap ketersediaan data baru.
- Penerapan variabel global dengan multi-threaded: Terdapat banyak cara untuk melakukan threads communication, viz, message passing, shared memory, mail boxes, dan lain sebagainya. Sebuah variabel global adalah bentuk form sederhana untuk berbagi memori. Ketika dua threads berbagi informasi melalui variabel global, maka dibutuhkan kualifikasi dengan volatile. Ketika threads beroperasi secara sinkron, maka setiap pembaruan dari variabel global pada setiap threads harus ditambah oleh threads yang lebih baru. Kompilator akan membaca variabel global dan menempatkannya pada variabel sementara dari konteks threads saat ini. Untuk mengubahnya dalam bentuk null terhadap dampak dari optimisasi kompilator, seperti variabel global, maka harus dinyatakan dalam bentuk volatile.
- Kode program mungkin tidak pekerja sesuai perkiraan ketika optimisasi diaktifkan.
- Kode program tidak bekerja sesuai perkiraan ketika interrupt enabled dan berfungsi.
Perhatikan contoh program berikut untuk memahami bagaimana kompilator menginterpretasikan (interpreter) keyword volatile. Pada contoh berikut nilai dari object const dibuat nilainya menggunakan pointer dan dilakukan kompilasi kode tanpa pilihan optimisasi. Maka kompilator tidak akan melakukan proses optimisasi apapun yang akan mengubah nilai dari object const.
// Proses kompilasi program
// tanpa menggunakan optimi
// sasi oleh kompilator
#include <stdio.h>
int main(void)
{
const int local = 10;
int *ptr = (int*) &local;
printf("Inisialisasi nilai"
" variabel lokal : %d \n", local);
*ptr = 100;
printf("Modifikasi nilai "
"variabel lokal: %d \n", local);
return 0;
}
- Preprosesing kode program, yang menghasilkan ekstensi .i
- Assembly kode program, yang akan menghasilkan ekstensi .s
- Object code, yang akan menghasilkan ekstensi .0
Output:
[narendra@ubuntu]$ gcc volatile.c -o volatile –save-temps
[narendra@ubuntu]$ ./volatile
Inisialisasi nilai variabel lokal : 10
Modifikasi nilai variabel lokal: 100
[narendra@ubuntu]$ ls -l volatile.s
-rw-r–r– 1 narendra narendra 731 2016-11-19 16:19 volatile.s
[narendra@ubuntu]$
// Kompilasi kode program de
// ngan tahapan optimisasi
#include <stdio.h>
int main(void)
{
const int local = 10;
int *ptr = (int*) &local;
printf("Inisialisasi nilai dari"
" variabel lokal : %d \n", local);
*ptr = 100;
printf("Modifikasi nilai dari var"
"iabel lokal: %d \n", local);
return 0;
}
Output:
[narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temps
[narendra@ubuntu]$ ./volatile
Inisialisasi nilai dari variabel lokal : 10
Modifikasi nilai dari variabel lokal: 10
[narendra@ubuntu]$ ls -l volatile.s
-rw-r–r– 1 narendra narendra 626 2016-11-19 16:21 volatile.s
Selanjutnya dideklarasikan object const sebagai volatile dan kompilasi kode program dengan pilihan optimisasi. Meskipun dilakukan kompilasi kode program dengan pilihan optimisasi, nilai dari object const akan diubah, karena variabel dideklarasi sebagai volatile artinya adalah tidak melakukan optimisasi apapun pada program.
// Kompilasi kode program
// dengan tahapan optimisaasi
#include <stdio.h>
int main(void)
{
const volatile int local = 10;
int *ptr = (int*) &local;
printf("Inisialisasi nilai var"
"iabel lokal: %d \n", local);
*ptr = 100;
printf("Modifikasi nilai var"
"iabel lokal: %d \n", local);
return 0;
}
[narendra@ubuntu]$ ./volatile
Inisialisasi nilai variabel lokal: 10
Modifikasi nilai variabel lokal: 100
[narendra@ubuntu]$ ls -l volatile.s
-rw-r–r– 1 narendra narendra 711 2016-11-19 16:22 volatile.s
[narendra@ubuntu]$
Catatan: Beberapa contoh program yang diberikan sebelumnya mungkin hanya bekerja pada beberapa compiler khusus, dimana tujuan dari penggunaan contoh program tersebut adalah untuk dapat memahami tujuan dari konsep volatile.
- Penjelasan Singkat, Return Getchar dan Putchar pada Bahasa C [klik]
- Fakta tentang Scanset pada Bahasa C [klik]
- 4 Contoh Puts dan Printf ketika Cetak String Bahasa C [klik]
- Penjelasan Singkat, Fungsi %n Printf pada Bahasa C [klik]
- Cara Mencetak % Menggunakan Printf Bahasa C [klik]
- Perbedaan Utama Printf, Sprintf, dan Fprintf Bahasa C [klik]
- Perbedaan Utama Getc, Getchar, Getch, dan Getche pada Bahasa C [klik]
Secara umum, apa fungsi dari keyword volatile pada bahasa pemrograman?
BalasHapusDalam bahasa pemrograman komputer, khususnya dalam bahasa pemrograman C, C++, C£, dan Java, keyword atau kata kunci volatile digunakan untuk menunjukkan bahwa nilai variabel dapat berubah diantara akses program yang berbeda, meskipun kode program dari nilai variabel tersebut tidak dimodifikasi.
HapusApa fungsi dari keywor volatile secara sederhana?
BalasHapusKeyword volatile digunakan untuk mengubah nilai variabel dengan suatu thread yang berbeda. Dimana hal ini juga digunakan untuk membuat thread secara aman atau terlindungi. Dengan keyword volatile tersebut maka beberapa thread dapat menggunakan beberapa method atau fungsi dan instance kelas secara bersamaan tanpa muncul permasalahan atau pesan error apapun. Keyword volatile dapat digunakan baik pada tipe data objek ataupun tiped ataupun primitif.
Hapusentahlah, sepertinya masih belum sederhana
Hapus