volatile原文volatileは変数を修飾するキーワードで、型宣言の前に付けて、コンパイラが変数を取り扱う方法を変更します。 具体的には、変数をレジスタではなくRAMからロードするよう、コンパイラに指示します。ある条件では、レジスタに記憶された変数の値は不確かだからです。 変数をvolatileとして宣言する必要があるのは、その変数がコントロールの及ばない別の場所(たとえば並行して動作するコード)で変更される可能性があるときです。Arduinoの場合、そうした状況が当てはまるのは、割り込みサービスルーチン(ISR)と呼ばれる、割り込み関連のコードだけです。 【注意】 volatile変数が1バイトより大きい場合(たとえば16ビットintや32ビットlong)、8ビットマイコンでは一度に読むことができません。メインのコードがint変数の最初の8ビットを読んでいる間に、ISRが2番目の8ビットを変更する可能性があるということです。もしそうなると変数の値は予測できません。この問題に対処するためには、noInterrupts()で割り込みを一時的に停止するか、ATOMIC_BLOCKマクロの使用を検討してください。 【例】 割り込みピンの状態が変化したらLEDを反転(トグル)させる例です。 int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; } [目次へ戻る] |
Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください [Arduino wiki]