組込みプログラムだから無限ループ、そんなわけないだろ

組込みプログラマがbusyループを書いて許されるのは20世紀までだよね… とずっと思ってた。だって電気勿体ないじゃん。

 

 

だから、たとえばArduinoのサンプルでよくこんなのがあって、それが組込みプログラムの代表例みたいに語られてると、なんかモヤモヤする。

int led = 9;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}

 

 

delay()、なにやってるかわかる? 単にbusy-loopで指定時間分を待ってるだけだぞ。

「delay()中は他のことができないからmillis()を使いましょう」って言って、無限ループの中でmillis()を見張ってタイミングがきたら何か動作する、みたいな。

「ちゃんとスリープしてタイマ割り込みで復活するってのをちゃんと紹介してるヤツはいねーのかよ」って思って検索しても「delay()だといろんなことを並列にできないからタイマ割り込みでフラグを立てて、loop()の中では常に全力でそのフラグをチェックしてフラグが立ってたら処理を行うようにしました」みたいな、それだったらmillis()のほうがまだマシじゃねーかみたいな斜め上の解説が検索上位にヒットしてきたり。

 

 

違うだろ。そんなんじゃなくて、1クロックも無駄にするなとは言わないけど、できるだけCPUを動かさないようにちょっとくらいは考えるのが普通じゃないのか。「午後1時にxを、午後2時にyをやらないといけない」ってときに、午後1時になるまでずっと時計を見て1秒毎にいまは午後1時と午後2時になったかを確認しながら過ごすのは大人のやることじゃない。複数やらないといけないことがあったら、その将来のイベントを時系列順にリストのように並べておいていちばん直近のイベントまで寝る、というのが物心ついた人間の行動だろ。

 

 

って思うのだけど、上の例だったらもう2秒間のうち1秒間もの時間、LEDがついている時点でダメだからもうどうでもいいのかもしれない。組込みプログラムにもいろいろあるよね。時計とかウェアラブル機器のような小さい電池で動くプログラムの開発と、車載機器の開発では全然違って、前者では絶対にやってはいけないような電力の浪費が後者では許されている。自販機なんかだともっと豪勢だ。だからまあ一部だけを見て全部を語られるとモヤモヤするよね。そしてGoogleは最近検索にゴミが混じりすぎなのでもうちょっとちゃんとしてくれ。