Açıklama
volatile
değişken niteleyici olarak bilinen bir anahtar kelimedir, genellikle bir değişkenin veri tipinden önce, derleyicinin ve sonraki programın değişkeni işleme şeklini değiştirmek için kullanılır.
Değişken bildirme volatile
derleyiciye bir direktif olduğunu. Derleyici, C / C ++ kodunuzu Arduino'daki Atmega çipinin gerçek talimatları olan makine koduna çeviren yazılımdır.
Özellikle, derleyiciyi, değişkenin depolandığı ve işlendiği geçici bir bellek konumu olan bir depolama kaydından değil, RAM'den yüklenmesini yönlendirir. Belirli koşullar altında, yazmaçlarda saklanan bir değişkenin değeri yanlış olabilir.
Bir değişken beyan edilmelidir volatile
değeri göründüğü kod bölümünün, kontrolü dışında bir şey tarafından değiştirilebilir her bir eş zamanlı olarak yürütülmesi bir iplikle donatılmıştır. Arduino'da bunun gerçekleşmesi muhtemel tek yer, kesme hizmeti rutini olarak adlandırılan kesmelerle ilişkili kod bölümleridir.
int veya uzun uçucular
volatile
değişken bir bayttan daha büyükse (örneğin, 16 bit int veya 32 bit uzunluğunda), o zaman mikrodenetleyici bir adımda okuyamaz, çünkü 8 bitlik bir mikrodenetleyicidir. Bu, ana kod bölümünüzün (örneğin, döngünüz) değişkenin ilk 8 bitini okurken, kesmenin zaten ikinci 8 biti değiştirebileceği anlamına gelir. Bu, değişken için rastgele değerler üretecektir.
Çözüm:
Değişken okunurken, kesilmelerin devre dışı bırakılması gerekir, böylece okunduklarında bitlerle karışamazlar. Bunu yapmanın birkaç yolu vardır:
DİL noInterrupts
ATOMIC_BLOCK makrosunu kullanın. Atomik operasyonlar tek MCU operasyonlarıdır - mümkün olan en küçük birim.