地球のために、今何かしよう! (..って言うか、本当は自分のためなんだが。)
タイマなどでインターバルに割り込みハンドラを起動する様な処理では、main関数の中のwhile(1)の無限ループの中身が空になる事がある。
|
#include "monitor.h" |
これって意味あるんだろうか?
仮に、この無限ループが無かったら、いったい何が起こるんだろうか。
...という疑問に答える前に、mainも関数である事は、C言語のプログラマにとっては常識である。関数である以上は、どこかから呼び出されているはずだ。いったい誰が呼び出しているのかと思った皆さん。
あなたは偉い!
本稿のプログラミングでは、monitor.hというヘッダファイルを必ずincludeしている。これは、ルネサスエレクトロニクスが開発したH8用モニタを使うために必要なもので、この中身を見てみると、
|
#include < machine.h > #define printf ((int (*)(const char *,...))0x00002b52) #pragma section VECTBL void PowerON_Reset(); typedef void (*fp)(void); const fp VectorTable[] = // ベクタテーブルの定義 ... 略 ... (fp)0L // vector 60 ADI #pragma section /* int main(void); __entry voidPowerON_Reset(void) |
なんていう風になっている。一番下を見てみると、PowerOnReset()と言う関数があって、その中にmain();と言う記述が見つかる。
要するに、main()はPowerOnResetから呼び出される関数と言うことだ。 ...
と言う事は、while(1)の無限ループが無かったとすると、main()はPowerOnResetにreturnする事になる。
returnした後はどうなるのか。printfでプログラム終了を表示した後、sleep()と言う関数を実行しているが、sleepって何?
sleep()は、CPUを停止して低消費電力モードに移行させる関数である。sleep()で制御可能な低消費電力モードには2つあって、
つまり、sleep()を実行する事によって、CPUは動作を停止し、消費電力少なくするモードに移行するということ。
この処理を行わないと、どういうことになるかと言うと、この先はプログラムが無いので、CPUは暴走状態になる。
| ※CPUを停止すると、何故、エコなのかと言うと、何をするにしても、「何かをするにはエネルギーが必要だ。」 と言うことに尽きる。真のエコとは、「何もしない事」と同義である。 |
さて、だいぶ回り道をしてしまったが、これまでの議論で、main()の中にあるwhileの無限ループを終了すると、CPUが停止する事がわかった。スリープ・モードやソフトウエア・スタンバイ・モードの様なエコなモードがある事も知った。
while(1)の無限ループは、プログラムを終了させないために、ムダにCPUを動作させている状態と見ることもできる。であれば、この間CPUを止めちゃうのもエコじゃないか?
ということで、
| #include "monitor.h" ...... #pragma interrupt(timer_handler) void timer_handler() { .... } int main() { ...... and_ccr(0x7F);// sleep()を呼んだ時に、スリープ・モードに遷移 while(1) { sleep(); } } |
とするのが、これからの技術者としては、正しい姿勢と思われる。(本当は、もっと色々と細かい設定があるが、詳細はマニュアルに譲る)
小さなマイコンで削減できる電力は、僅かなものであるが、「塵も積もれば」であるし、バッテリ駆動の場合は、死活問題(スマホのユーザならすぐに想像がつくであろう)でもある。