Senin, November 18, 2019

Pemahaman Volatile tahap 2

Keyword volatile dimaksudkan untuk mencegah kompilator melakukan optimisasi pada object yang dapat mengubah proses yang tidak dapat ditentukan oleh kompilator.

Deklarasi object sebagai volatile dihilangkan dari optimisasi karena nilainya dapat diubah oleh kode luar program dari kode program saat ini. Sistem selalu membaca nilai saat ini dari object volatile dari lokasi memori ketimbang mempertahankannya dalam register sementara pada titik dimana hal tersebut digunakan, meskipun isntruksi sebelumnya diminta untuk nilai dari object yang sama. Jadi pertanyaan sederhanyanya adalah, apakah nilai dari perubahan variabel yang sedemikian rupa tidak dapat diperkirakan oleh compiler. Perhatikan contoh kasus berikut ini untuk menjawab pertanyaan tersebut.

satu, 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.

dua, 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.

Ketika tidak digunakan qualifier volatile, maka akan muncul beberapa bentuk masalah berikut:

satu, Kode program mungkin tidak pekerja sesuai perkiraan ketika optimisasi diaktifkan.
dua, 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.


Ketika dilakukan kompilasi kode program dengan "-save-temps" option dari gcc, maka akan dilakukan generate tiga output file:

satu, Preprosesing kode program, yang menghasilkan ekstensi .i
dua, Assembly kode program, yang akan menghasilkan ekstensi .s
tiga, Object code, yang akan menghasilkan ekstensi .0

Kode program dikompilasi tanpa melakukan tahap optimisasi, sehingga ukuran dari kode assembly yang dihasilkan akan menjadi lebih besar.

Output:
  [narendra@ubuntu]$ gcc volatile.c -o volatile –save-temps
  [narendra@ubuntu]$ ./volatile
  Initial value of local : 10
  Modified value of local: 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.


Pada contoh sebelumnya, program melakukan optimisasi sehingga ukuran dari assembly code menjadi lebih kecil.

Output:
  [narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temps
  [narendra@ubuntu]$ ./volatile
  Initial value of local : 10
  Modified value of local: 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.

Output:
  [narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temp
  [narendra@ubuntu]$ ./volatile
  Initial value of local : 10
  Modified value of local: 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.





Related Posts

Pemahaman Volatile tahap 2
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "