volatile



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:

  1. DİL noInterrupts

  2. ATOMIC_BLOCK makrosunu kullanın. Atomik operasyonlar tek MCU operasyonlarıdır - mümkün olan en küçük birim.

Örnek Kod

// toggles LED when interrupt pin changes state

int pin = 13;
volatile byte state = LOW;

void setup() {
  pinMode(pin, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), blink, CHANGE);
}

void loop() {
  digitalWrite(pin, state);
}

void blink() {
  state = !state;
}
 #include <util/atomic.h> // this library includes the ATOMIC_BLOCK macro. volatile int input_from_interrupt; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { // code with interrupts blocked (consecutive atomic operations will not get interrupted) int result = input_from_interrupt; } 

Ayrıca Bakınız

LANGUAGE attachInterrupt

Komut const

Komut scope

Komut static