前回のTickerを使ったタイマー割り込みと今回のシリアル受信割り込みのプログラムを比較してみましょう。
前回のプログラムも今回のプログラムも非常に似た動作になることに気が付かれたでしょうか。元になった2つのプログラムが同じなので、当然といえば当然なのですが、2つの構造は全く異なります。
このプログラムでは、発光ダイオードの点滅とシリアルポートに対するエコー処理(受信したデータを送信元に送り返す)という2つの処理が同時に並行して実行されているように見えますね。
前回紹介したTickerを用いたプログラムは、メインルーチンでシリアルポートのエコー処理を行い発光ダイオードの点滅をTickerによる割り込み処理関数で行っています。これに対して今回紹介したシリアル割り込みを使ったプログラムでは、メインルーチンで発光ダイオードの点滅処理を行い、割り込み処理関数でシリアルポートのエコー処理を行っています。
(編注:初出時、Tickerを用いた割り込みとシリアル割り込みについて全く同じと記載しましたが、正しくは異なりますので、当該箇所を修正いたしました 2015/07/22)
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: }
2回に渡って、割り込み処理を用いて2つの処理を(擬似的に)同時処理させる方法について考えてみました。前回のプログラムと今回のプログラムでは動作こそ同じに見えるのですが、メインルーチンで行う処理と割り込み処理関数で行う処理が逆になっていましたね。
割り込み処理を使ったプログラムを設計する場合、どちらをメインルーチンにしてどちらを割り込み処理関数で処理させるかは思案のしどころかと思います。例えばLEDの点滅時間を正確に行いたい場合は、前回のTicker割り込みを使うべきでしょう。このあたりは、組み込み技術者として腕の見せ所ですね。
Copyright © ITmedia, Inc. All Rights Reserved.