それではlist4のプログラムを解説します。
2行目でTickerクラスのインスタンスをtimerという名前で生成しています。5行目から7行目までは割り込み処理関数です。この関数内でLEDの状態を反転させ、LEDに代入しています。結果として、このピンにつながった発光ダイオードは、この関数が呼び出せるごとに「点灯している場合は消灯、または消灯している場合は点灯」という動作をします。
8行目からがメイン関数です。9行目でLEDの初期値を設定しています。最初の発光ダイオードの状態は「1」なので点灯から始まります。10行目でTickerクラスのattachというメソッドを使って、割り込み処理関数の設定と登録をしています。
設定はTickerクラスが取り扱う割り込み事象である「時間経過」の設定、登録は割り込みが発生した時に実行したい「割り込み処理関数のアドレス」を登録しています。具体的には第一引数に割り込み処理関数のアドレスを設定、第2引数には割り込み処理関数を呼び出す時間間隔を設定します。浮動小数点で単位は秒となります。
これ以外にも、マイクロ秒単位で呼び出し間隔を設定できるメソッド(attach)も用意されています。このattachメッソドが実行されると、設定した時間間隔で割り込み関数が呼び出され続けます。この設定を解除するにはdetachメソッドを呼び出します。
1: #include "mbed.h" 2: Ticker timer; 3: DigitalOut led1(LED1); 4: Serial pc(USBTX,USBRX); 5: void attime(){ 6: led1 = !led1; 7: } 8: int main(){ 9: led1 = 1; 10: timer.attach(&attime,0.5); 11: while(1){pc.putc(pc.getc());} 12: }
14行目でシリアルポートの入力文字を送り返す処理をループの中で行っています。このループを実行しているさなか、あるいはgetc()で入力待ちになっている場合でも、時間経過による割り込みが発生するとattime関数に処理が移り、また戻ってきて続きから処理が再開されます。
あくまでもLPC1114はシングルコアのMPUですから、一度に複数の命令セットを実行することはできませんが、この仕組みにより、あたかも複数の処理が並列して実行されているように見えるのです。
今回は割り込みの概念を理解するため、時間経過を割り込み事象とするTickerの使い方を勉強しました。今までのプログラムだと一筆書きのように途切れることなく処理は進行していきますが、割り込みを使うと途中で他のルートに一瞬ワープして戻ってくるような処理が可能となります。逐次処理とは全く異なる概念ですので頭を柔らかくしておさらいしておいてください。
今回は時間経過が割り込み要因でしたが、次回は外部インタフェースからの割り込みについて考えてみます。お楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.