Jika kita mendeklarasikan variabel karena volatile
setiap kali nilai segar diperbarui
Jika kita mendeklarasikan variabel sebagai const
maka nilai variabel itu tidak akan berubah
Lalu const volatile int temp;
Apa gunanya mendeklarasikan variabel temp
seperti di atas?
Apa yang terjadi jika kita mendeklarasikan sebagai const int temp
?
const volatile int temp;
pada lingkup blok (yaitu di dalam{ }
), tidak ada gunanya di sana.Jawaban:
Objek yang ditandai sebagai
const volatile
tidak akan diizinkan untuk diubah oleh kode (kesalahan akan muncul karenaconst
kualifikasi) - setidaknya melalui nama / penunjuk tertentu itu.Bagian
volatile
dari kualifikasi berarti bahwa kompilator tidak dapat mengoptimalkan atau menyusun ulang akses ke objek tersebut.Dalam sistem tertanam, ini biasanya digunakan untuk mengakses register perangkat keras yang dapat dibaca dan diperbarui oleh perangkat keras, tetapi tidak masuk akal untuk menulis (atau mungkin merupakan kesalahan untuk menulis).
Contohnya mungkin register status untuk port serial. Berbagai bit akan menunjukkan apakah sebuah karakter sedang menunggu untuk dibaca atau jika register pengirim siap menerima karakter baru (mis., - kosong). Setiap pembacaan register status ini dapat menghasilkan nilai yang berbeda tergantung pada apa lagi yang terjadi di perangkat keras port serial.
Tidak masuk akal untuk menulis ke register status (tergantung pada spesifikasi perangkat keras tertentu), tetapi Anda perlu memastikan bahwa setiap pembacaan register menghasilkan pembacaan perangkat keras yang sebenarnya - menggunakan nilai cache dari pembacaan sebelumnya menang ' t memberi tahu Anda tentang perubahan dalam status perangkat keras.
Contoh singkatnya:
unsigned int const volatile *status_reg; // assume these are assigned to point to the unsigned char const volatile *recv_reg; // correct hardware addresses #define UART_CHAR_READY 0x00000001 int get_next_char() { while ((*status_reg & UART_CHAR_READY) == 0) { // do nothing but spin } return *recv_reg; }
Jika petunjuk ini tidak ditandai sebagai
volatile
, beberapa masalah mungkin terjadi:*recv_reg
diubah oleh loop, tidak ada alasan ia tidak dapat dibaca sebelum memasuki loop.The
volatile
kualifikasi memastikan bahwa optimasi ini tidak dilakukan oleh compiler.sumber
volatile
akan memberitahu compiler untuk tidak mengoptimalkan kode yang berhubungan dengan variabel, biasanya ketika kita tahu itu dapat diubah dari "luar", misalnya oleh thread lain.const
akan memberi tahu compiler bahwa program tersebut dilarang untuk mengubah nilai variabel.const volatile
adalah hal yang sangat istimewa yang mungkin Anda lihat digunakan tepat 0 kali dalam hidup Anda (tm). Seperti yang diharapkan, ini berarti program tidak dapat mengubah nilai variabel, tetapi nilai dapat dimodifikasi dari luar, sehingga tidak ada pengoptimalan yang akan dilakukan pada variabel tersebut.sumber
volatile
variabel biasanya terjadi ketika Anda mulai mengotak-atik perangkat keras, bukan dengan utas lain. Yang pernah saya lihatconst volatile
digunakan dalam hal-hal seperti register status yang dipetakan memori atau sejenisnya.Ini bukan karena variabelnya adalah const sehingga mungkin tidak berubah antara dua titik urutan.
Constness adalah janji yang Anda buat untuk tidak mengubah nilainya, bukan bahwa nilainya tidak akan berubah.
sumber
const
data tidak "konstan".Saya perlu menggunakan ini dalam aplikasi tertanam di mana beberapa variabel konfigurasi berada di area memori flash yang dapat diperbarui oleh bootloader. Variabel config ini 'konstan' selama runtime, tetapi tanpa qualifier volatile compiler akan mengoptimalkan sesuatu seperti ini ...
cantx.id = 0x10<<24 | CANID<<12 | 0;
... dengan menghitung nilai konstanta dan menggunakan instruksi perakitan langsung, atau memuat konstanta dari lokasi terdekat, sehingga setiap pembaruan ke nilai CANID asli di area flash konfigurasi akan diabaikan. CANID harus menjadi const volatile.
sumber
Dalam C,
const
andvolatile
are type qualifier dan keduanya independen.Pada dasarnya,
const
artinya nilai tersebut tidak dapat diubah oleh program.Dan
volatile
artinya nilainya dapat berubah secara tiba-tiba (mungkin dari luar program).Faktanya, Standar C memberikan contoh deklarasi yang valid yaitu
const
danvolatile
. Contohnya adalah:extern const volatile int real_time_clock;
di mana
real_time_clock
dapat dimodifikasi oleh perangkat keras, tetapi tidak dapat ditetapkan, ditambah, atau dikurangi.Jadi kita sudah harus memperlakukan
const
danvolatile
memisahkan. Jenis kualifikasi ini dapat diterapkan untukstruct
,union
,enum
dantypedef
juga.sumber
const
Artinya variabel tidak bisa dimodifikasi oleh kode c, bukan berarti tidak bisa diubah. Artinya tidak ada instruksi yang dapat menulis ke variabel, tetapi nilainya mungkin masih berubah.volatile
berarti bahwa variabel dapat berubah setiap saat dan dengan demikian tidak ada nilai cache yang dapat digunakan; setiap akses ke variabel harus dijalankan ke alamat memorinya.Karena pertanyaan diberi tag "tertanam" dan misalkan
temp
adalah variabel yang dideklarasikan pengguna, bukan register terkait perangkat keras (karena ini biasanya ditangani dalam file .h terpisah), pertimbangkan:Prosesor tertanam yang memiliki memori data baca-tulis (RAM) volatile dan memori data read-only non-volatile, misalnya memori FLASH dalam arsitektur von-Neumann, di mana data dan ruang program berbagi data dan bus alamat yang sama.
Jika Anda menyatakan
const temp
memiliki nilai (setidaknya jika berbeda dari 0), compiler akan menetapkan variabel ke alamat di ruang FLASH, karena meskipun ditetapkan ke alamat RAM, ia masih membutuhkan memori FLASH untuk menyimpan nilai awal variabel, membuat alamat RAM membuang-buang ruang karena semua operasi bersifat hanya baca.Karena itu:
int temp;
adalah variabel yang disimpan dalam RAM, diinisialisasi ke 0 saat startup (cstart), nilai cache dapat digunakan.const int temp;
adalah variabel yang disimpan dalam FLASH (read-ony), diinisialisasi ke 0 pada waktu kompilator, nilai yang di-cache dapat digunakan.volatile int temp;
adalah variabel yang disimpan dalam RAM, diinisialisasi ke 0 saat startup (cstart), nilai yang di-cache TIDAK akan digunakan.const volatile int temp;
adalah variabel yang disimpan dalam FLASH (read-ony), diinisialisasi ke 0 pada waktu kompilator, nilai yang di-cache TIDAK akan digunakanInilah bagian yang berguna:
Saat ini kebanyakan prosesor Embedded memiliki kemampuan untuk membuat perubahan pada memori non-volatile read-only mereka melalui modul fungsi khusus, dalam hal
const int temp
ini dapat diubah saat runtime, meskipun tidak secara langsung. Dengan kata lain, suatu fungsi dapat mengubah nilai di alamat tempattemp
disimpan.Contoh praktis akan digunakan
temp
untuk nomor seri perangkat. Pertama kali prosesor tertanam dijalankan,temp
akan sama dengan 0 (atau nilai yang dideklarasikan) dan fungsi dapat menggunakan fakta ini untuk menjalankan pengujian selama produksi dan jika berhasil, minta untuk diberi nomor seri dan ubah nilainyatemp
dengan cara dari fungsi khusus. Beberapa prosesor memiliki kisaran alamat khusus dengan memori OTP (one-time programmable) hanya untuk itu.Tapi inilah perbedaannya:
Jika
const int temp
merupakan ID yang dapat dimodifikasi dan bukan nomor seri yang dapat diprogram satu kali dan TIDAK dideklarasikanvolatile
, nilai yang di-cache dapat digunakan hingga boot berikutnya, yang berarti ID baru tersebut mungkin tidak valid hingga boot ulang berikutnya, atau lebih buruk lagi, beberapa fungsi mungkin menggunakan nilai baru sementara yang lain mungkin menggunakan nilai cache yang lebih lama sampai reboot. Jikaconst int temp
IS dideklarasikanvoltaile
, perubahan ID akan segera berlaku.sumber
Anda bisa menggunakan
const
danvolatile
bersama - sama. Misalnya, jika0x30
diasumsikan sebagai nilai port yang diubah oleh kondisi eksternal saja, pernyataan berikut akan mencegah kemungkinan efek samping yang tidak disengaja:const volatile char *port = (const volatile char *)0x30;
sumber
Artikel ini membahas skenario di mana Anda ingin menggabungkan const dan qualifier volatile.
http://embeddedgurus.com/barr-code/2012/01/combining-cs-volatile-and-const-keywords/
sumber
Sederhananya, Nilai dalam variabel 'const volatile' tidak dapat dimodifikasi secara terprogram tetapi dapat dimodifikasi oleh perangkat keras. Volatile di sini adalah untuk mencegah pengoptimalan compiler.
sumber
Kami menggunakan kata kunci 'const' untuk variabel ketika kami tidak ingin program mengubahnya. Sedangkan ketika kita mendeklarasikan variabel 'const volatile' kita memberi tahu program untuk tidak mengubahnya dan compiler bahwa variabel ini dapat diubah secara tidak terduga dari input yang datang dari dunia luar.
sumber