constArtinya 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.
volatileberarti 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 tempadalah 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 tempmemiliki 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 tempini dapat diubah saat runtime, meskipun tidak secara langsung. Dengan kata lain, suatu fungsi dapat mengubah nilai di alamat tempat tempdisimpan.
Contoh praktis akan digunakan tempuntuk nomor seri perangkat. Pertama kali prosesor tertanam dijalankan, tempakan 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 tempdengan 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 tempmerupakan 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 tempIS dideklarasikan voltaile, perubahan ID akan segera berlaku.
const volatile int temp;pada lingkup blok (yaitu di dalam{ }), tidak ada gunanya di sana.