ArduinoのSketch(スケッチ)では、変数に修飾子をつけて変数を宣言する事ができます。
修飾子をつけて変数を宣言すると、そのキーワードに応じた性質を変数が持つ事になります。
static修飾子
関数内でstaticを付けて宣言するとスタティック変数になります。通常のローカル変数は、関数が呼ばれる度に生成と破棄が行われますが、スタティック変数は継続的で、関数が初めて呼ばれたときに1度だけ生成され、関数が繰り返し呼ばれても、ずっと値が保持されます。
/* RandomWalk
* Paul Badger 2007
* RandomWalk wanders up and down randomly between two
* endpoints. The maximum move in one loop is governed by
* the parameter "stepsize".
* A static variable is moved up and down a random amount.
* This technique is also known as "pink noise" and "drunken walk".
*/
#define randomWalkLowRange -20
#define randomWalkHighRange 20
int stepsize;
int thisTime;
int total;
void setup()
{
Serial.begin(9600);
}
void loop()
{ // tetst randomWalk function
stepsize = 5;
thisTime = randomWalk(stepsize);
Serial.println(thisTime);
delay(10);
}
int randomWalk(int moveSize){
static int place; // variable to store value in random walk - declared static so that it stores
// values in between function calls, but no other functions can change its value
place = place + (random(-moveSize, moveSize + 1));
if (place < randomWalkLowRange){ // check lower and upper limits
place = place + (randomWalkLowRange - place); // reflect number back in positive direction
}
else if(place > randomWalkHighRange){
place = place - (place - randomWalkHighRange); // reflect number back in negative direction
}
return place;
}
Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
“Arduino Reference:Static” by Arduino Team is licensed under CC BY-SA 3.0
上記の例では、31行目の、
static int place;
でstatic修飾子をつけて、変数placeを宣言しています。これにより場所を表す変数placeの値を継続的なものにしています。
volatile修飾子
volatile修飾子を型宣言の前に付けて宣言すると、変数をレジスタではなくRAMからロードするよう、コンパイラに指示する事ができます。この様な指示が必要になるのは、特定条件では、レジスタに記憶された変数の値は不確かになるからです。具体的には、変数がコントロールの及ばない別の場所(たとえば並行して動作するコード)で変更される可能性があるときです。Arduinoの場合、割り込みサービスルーチンと呼ばれる、割り込みに関連したコードが、これに該当します。
// toggles LED when interrupt pin changes state
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 (CC BY-SA 3.0)
“Arduino Reference:volatile keyword” by Arduino Team is licensed under CC BY-SA 3.0
上の例では、4行目で、
volatile int state = LOW;
とvolatile修飾子付きで変数宣言しています。これで、割り込み発生時とメインループの双方から、安全にstateにアクセスする事が出来ます。
const修飾子
const修飾子をつけて変数を宣言すると、その変数は読み取りのみ可で実質的な定数になります。値は変更できなくなり、値を代入しようとすると、コンパイルエラーが発生します。
const float pi = 3.14;
float x;
// ....
x = pi * 2; // it's fine to use const's in math
pi = 7; // illegal - you can't write to (modify) a constant
Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
“Arduino Reference:const keyword” by Arduino Team is licensed under CC BY-SA 3.0
上の例では、1行目の
const float pi = 3.14;
で、piをconst付で宣言して使用していますが、8行目で値を代入しようとしていますので、コンパイルは通りません。
まとめ
必要に応じて修飾子をつけた変数宣言を行うと、効率および安全性を高めたプログラミングが可能になります。修飾子には上記以外にもPROBMEM等がありますが、別の機会に説明したいと思います。
Sponsored Link