他人のコードをもらってきてモジュールの動作確認に使うのがArduinoの本分だと言いつつも、用意されている関数の本当を知りたい気もする。
深追いする気はないのだけれど、表題の通りdelay()とmillis()だけ調べてみた。
ソースがどこにあるのかというと、
Arduino_IDE_1.8.8¥hardware¥arduino¥avr¥cores¥arduino¥wiring.c
に書かれている。
Arduino_IDE_1.8.8 はバージョンやインストール先によって異なると思うが、その中のhardware以下の構造は同じはずだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
unsigned long millis() { unsigned long m; uint8_t oldSREG = SREG; // disable interrupts while we read timer0_millis or we might get an // inconsistent value (e.g. in the middle of a write to timer0_millis) cli(); m = timer0_millis; SREG = oldSREG; return m; } |
1 2 3 4 5 6 7 8 9 10 11 12 |
void delay(unsigned long ms) { uint32_t start = micros(); while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { ms--; start += 1000; } } } |
変数はもっと上の方で宣言されていたりするわけだが、何をやっているのかはわかる。
Tweet