Volatile Bahasa C dan Fungsinya
{/* Diasumsikan bahwa status tersebut tidak akan berubah pada saat looping ataupun selama program dijalankan */
/* Selama nilai status adalah NOL, lakukan looping */}
- Setiap implementasi kompilator berbeda sehingga bukan merupakan solusi yang portabel untuk dapat melaksanakan hal tersebut.
- Hanya karena satu variabel, bukan berarti harus mematikan semua proses optimisasi yang dilakukan oleh kompilator pada keseluruhan program.
- Dengan mematikan semua proses optimisasi, program low level tidak dapat bekerja seperti yang diharapkan karena akan meningkatkan terlalu banyak ukuran dan penundaan eksekusi.
Untuk Mengatasi Permasalah Tersebut, maka Solusi yang Dapat Digunakan Adalah Menggunakan Volatile.
volatile uint32 status = 0;
Untuk penyederhanaan penjelasan, disajikan contoh seperti yang diperlihatkan sebelumnya. Namun, secara umum penggunaan volatile adalah dengan pointer seperti berikut ini:
volatile uint32 * statusPtr = 0xF1230000
Berikut ini statusPtr melakukan pointer ke lokasi memori pada konten yang dapat berubah pada waktu tertentu dari beberapa perangkat peripheral. Perlu dicatat bahwa program yang dibuat mungkin tidak memiliki kontrol apapun atau pengetahuan apapun ketika memori mengalami perubahan, sehingga tujuan dari penggunaan "volatile" adalah agar kompilator tidak melakukan optimisasi untuk variabel volatile yang ditunjuk (pointer) oleh statusPtr tersebut.
Dalam hal ini "volatile" mengikuti standar dari ISO/IEC 9899 C11 - clause 6.7.3
“An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects.”
“A volatile declaration may be used to describe an object corresponding to a memory-mapped input/output port or an object accessed by an asynchronously interrupting function. Actions on objects so declared shall not be ‘‘optimized out’’ by an implementation or reordered except as permitted by the rules for evaluating expressions.”
- 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]$
Selanjutnya, lakukan kompilasi program dengan pilihan optimisasi. Pada code thr berikut ini, "local" dideklarasikan sebagai const (dan non-volatile), GCC kompilator melakukan optimisasi dan mengabaikan perintah untuk mengubah nilai dari object const. Dengan hasil nilai dari object const adalah sama.
// 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.
- Getchar dan Putchar Bahasa C Beserta Fungsinya
- Scanset Bahasa C dan Fungsinya
- Mencetak String Bahasa C menggunakan Puts dan Printf
- Printf %n Bahasa C dan Fungsinya
- Mencetak Simbol % Menggunakan Printf Bahasa C
- Printf, Sprintf, dan Fprintf Bahasa C Beserta Fungsinya
- Getc, Getchar, Getch, dan Getche Bahasa C Beserta Perbedaannya
9 komentar untuk "Volatile Bahasa C dan Fungsinya"
Hubungi admin melalui Wa : +62-896-2414-6106
Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.
Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.
- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -
Apa fungsi keyword volatile pada bahasa C?
BalasHapusKeyword atau kata kunci volatile pada bahasa C adalah suatu kualifikasi yang diterapkan ke suatu variabel tertentu ketika variabel tersebut dideklarasikan. Dengan menggunakan keyword volatile tersebut maka kompilator dapat mengetahui bahwa nilai variabel tersebut dapat berubah kapan saja tanpa tindakan apapun yang diambil oleh kode program yang ditemukan kompilator selama proses kompilasi.
HapusKeyword volatile dapat diubah dari luar kode program yang dikompilasi oleh kompilator. Contoh, sebuah program dapat memetakan variabel volatile ke register yang dipetakan oleh memori, dimana dalam hal ini kompilator tidak akan menerapkan optimisasi apapun ke dalam kode program yang menangani variabel volatile tersebut.
BalasHapusKapan keyword volatile dapat digunakan?
BalasHapusKeyword volatile dapat digunakan ketika ingin mencegah kompilator untuk menerapkan suatu optimisasi apapun pada objek yang dapat berubah dengan cara yang tidak dapat ditentukan atau diprediksi oleh kompilator. Dimana objek yang dideklarasikan sebagai volatile tersebut akan dihilangkan dari proses optimisasi karena nilainya dapat diubah oleh kode program diluar dari cakupan kode program itu sendiri dan kapan saja.
HapusSecara 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.
Hapus