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 digunakan
Inilah 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 tempat temp
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 nilainya temp
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 dideklarasikan volatile
, 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. Jika const int temp
IS dideklarasikan voltaile
, perubahan ID akan segera berlaku.
const volatile int temp;
pada lingkup blok (yaitu di dalam{ }
), tidak ada gunanya di sana.