皆さんこんばんは!
今日は割り込みについて、皆さんにシェアしたいと思います。
理解しやすいようにサンプルを下に用意してありますので、それも合わせてご覧ください!
割り込みって何?
そもそも、割り込みって何かご存じでしょうか?
普段皆さんが使われているPCでもごく普通に割り込みが使われています!
ほら、目の前、手元にあるそれですよ!!!
キーボード、マウス、ディスプレイ、全部CPUの割り込み機能によって実現されているんです。
割り込みとは、簡単に言うと、あらかじめ登録された命令を外部の要因(例えばボタンが押されたなど)で
最優先で実行するCPUの機能の事を言います。
最近のCPUやOSでは最優先というのはちょっと語弊がありますが(割り込みにも優先レベルがあるCPUが今は
ほとんどですので)、だいたいそう思っていただければ。
32bitのOSの頃や少し前のIntelのCPUでは、例えば、C言語の標準関数である、malloc()なども、
int80という割り込みを使って、カーネルモードに移行して、カーネル内部にある、メモリ取得機能を
実行して戻ってくるなんてことをやってました。
なので、割り込みって実は身近な存在なんです!!!
さてArduinoでは、リファレンスに公開されている機能だけを使うのであれば、
pin2,pin3が割り込み外部要因pinとして使えます。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=3045
コレがリファレンスです。
例えば、pin2に光センサーを取り付けて、暗くなったら、pin2がHIGH,LOWどちらかに変わるように
しておけば、暗くなった時に何か処理をさせることが出来ます。
実は、Arduinoは、Atmega328などのAVR CPUを使っており、このCPUは他のピンも
外部要因ピンとして動作させることが出来ます!
詳しくは、データシートをご覧ください。(ご要望があれば書きます)
http://www.avr.jp/
ここから詳しいCPUの解説が書いてあるデータシートをDLすることが出来ます。
一つだけ用語説明を!
上で出てきた、あらかじめ登録された命令をある特別なメモリ領域に記憶させておくのですが、
このメモリ領域の事を割り込みベクタといいます。
名前はvector=ベクタ=ベクトルから来ており割り込みが発生したらどこの処理をして良いのか
を指し示す方向という意味から名付けられたんだと思います。
割り込みって何がいいの?
Arduinoの場合、loop()がずっとぐるぐる回っていますので、なんで割り込みが良いのかわかり
にくいと思います。
loopの処理が軽ければ特に問題はあまり出てこないのですが、例えば、delay等が入っており、
1ループあたり30秒もかかるプログラムだった時に、外部要因に出来るだけ早く応答するシステム
を作る必要があるとき、普通に作ると、最大30秒もの遅延が発生します。
しかし、割り込みを使えば、loopの処理が実行中でも、優先的に割り込み処理をCPUは実行しますので、
遅延をかなり押さえることが出来ます。
loopなどで状態を見に行くことをポーリングといいます。
一方割り込みはCPUの機能なので、ポーリングという時間さえ省くことが出来るのです。
これは、遅延が許されないシステムを作るときには必須の知識です。
さて、一般的なpin2,pin3で実現しても良かったのですが、どうせなら、難しい方(データシートを
見ないとわからないと言う意味)の割り込みで実現したサンプルがあります。
コレです!!!
https://github.com/developerwaiwai/Arduino-Various/tree/master/auto_switch_optical_sensor_interrupt
これは私が書いたサンプルです。
pin4に光センサをつないで暗くなったら、pin5に刺さっているサーボを動かして、電気をつけるサンプルです。
コレを応用して作ったものが、自作IoTですwww
Arduino,Raspberry Pi,Windows Azureを使用した上から下までのフルシステムですw
興味のある方は是非、ソースを覗いて行ってください。
https://github.com/developerwaiwai/MyHomeSwitch
最後に
割り込みの概念がわかれば、OSのドライバを書くこともとても簡単になります!
一度トライしてみてはいかがでしょうか。