検索
連載

シリアル割り込みを使って、2つのプログラムを並行動作させる「mbed」で始めるARMマイコン開発入門(10)(3/3 ページ)

“割り込み”の概念を理解することで、複数のプログラムを並行しているかのように処理できますが、その方法はタイマーを使うだけではありません。今回はシリアル割り込みを使った並行動作について学びます。

Share
Tweet
LINE
Hatena
前のページへ |       

Tickerとの比較

 前回の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:	}
List4

おわりに

 2回に渡って、割り込み処理を用いて2つの処理を(擬似的に)同時処理させる方法について考えてみました。前回のプログラムと今回のプログラムでは動作こそ同じに見えるのですが、メインルーチンで行う処理と割り込み処理関数で行う処理が逆になっていましたね。

 割り込み処理を使ったプログラムを設計する場合、どちらをメインルーチンにしてどちらを割り込み処理関数で処理させるかは思案のしどころかと思います。例えばLEDの点滅時間を正確に行いたい場合は、前回のTicker割り込みを使うべきでしょう。このあたりは、組み込み技術者として腕の見せ所ですね。

(次の記事を読む)

Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る