const
değişkenin c kodu ile değiştirilemeyeceği, değiştirilemeyeceği anlamına gelir. Bu, hiçbir talimatın değişkene yazamayacağı, ancak değerinin yine de değişebileceği anlamına gelir.
volatile
değişkenin herhangi bir zamanda değişebileceği ve dolayısıyla önbelleğe alınan hiçbir değerin kullanılamayacağı anlamına gelir; değişkene her erişim, hafıza adresine yürütülmelidir.
Soru "gömülü" olarak etiketlendiğinden ve temp
donanımla ilgili bir kayıt değil, kullanıcı tarafından tanımlanan bir değişken olduğu için (bunlar genellikle ayrı bir .h dosyasında ele alındıklarından), şunları göz önünde bulundurun:
Hem geçici okuma-yazma veri belleğine (RAM) hem de geçici olmayan salt okunur veri belleğine sahip gömülü bir işlemci, örneğin veri ve program alanının ortak bir veri ve adres yolunu paylaştığı von-Neumann mimarisinde FLASH bellek.
const temp
Bir değere sahip olduğunuzu beyan ederseniz (en azından 0'dan farklıysa), derleyici değişkeni FLASH alanındaki bir adrese atayacaktır, çünkü bir RAM adresine atanmış olsa bile, başlangıç değerini saklamak için yine de FLASH belleğe ihtiyaç duyar. Tüm işlemler salt okunur olduğundan RAM adresini alan israfı haline getirir.
Sonuç olarak:
int temp;
RAM'de depolanan bir değişkendir, başlangıçta 0 olarak başlatılır (cstart), önbelleğe alınan değerler kullanılabilir.
const int temp;
FLASH'da depolanan bir değişkendir, derleyici zamanında 0 olarak başlatılır, önbelleğe alınan değerler kullanılabilir.
volatile int temp;
RAM'de saklanan bir değişkendir, başlangıçta 0 olarak başlatılır (cstart), önbelleğe alınan değerler KULLANILMAZ.
const volatile int temp;
FLASH'da depolanan bir değişkendir, derleyici zamanında 0 olarak başlatılır, önbelleğe alınan değerler KULLANILMAZ
İşte yararlı kısım:
Günümüzde Gömülü işlemcilerin çoğu, özel bir işlev modülü aracılığıyla salt okunur geçici olmayan belleklerinde değişiklik yapma olanağına sahiptir, bu durumda const int temp
doğrudan olmasa da çalışma zamanında değiştirilebilir. Başka bir şekilde söylenirse, bir fonksiyon temp
saklandığı adresteki değeri değiştirebilir .
Pratik bir örnek temp
, cihazın seri numarası için kullanmak olacaktır . İlk kez gömülü işlemci çalışır, temp
0'a eşit (ya da beyan edilen değer) olacak ve bir fonksiyonu, bir seri numarası tahsis edilmesi için, üretim sırasında ve başarılı sayılabilmek eğer bir test için, bu gerçeği sormak kullanımı ve değerini değiştirmek için temp
vasıtasıyla özel bir işlev. Bazı işlemcilerin sadece bunun için OTP (tek seferlik programlanabilir) belleğe sahip özel bir adres aralığı vardır.
Ama işte fark geliyor:
Bir const int temp
defalık programlanabilir seri numarası yerine değiştirilebilir bir kimlik ise ve bildirilmemişse volatile
, bir sonraki önyüklemeye kadar önbelleğe alınmış bir değer kullanılabilir, yani yeni kimlik bir sonraki yeniden başlatmaya veya daha da kötüsü bazı işlevlere kadar geçerli olmayabilir. yeni değeri kullanabilirken, diğeri yeniden başlatılıncaya kadar daha eski bir önbelleğe alınmış değeri kullanabilir. const int temp
IS beyan edilirse voltaile
, kimlik değişikliği hemen geçerli olacaktır.
const volatile int temp;
blok kapsamı (yani iç de{ }
o hiçbir faydası yoktur vardır).