連載
» 2015年07月17日 07時00分 UPDATE

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

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

[今岡通博,MONOist]

 組み込みの世界で最も成功したプロセッサの1つ「ARM」を用いたマイコン開発にチャレンジするこの連載。これまではマイコン「LPC1114」に内蔵されているさまざまなペリフェラル(周辺機器)の使い方について勉強してきました。

前回はmbedのクラスライブラリーに含まれる「Ticker」を使って、デバイス側からの要求をCPU側に伝える仕組みであるタイマー割り込みについて勉強しました。

 一般的にデバイスと云えば、I/Oデバイスのように外部とのやりとりをするモノを思い浮かべますが、タイマーも1つのデバイスなのですね。さて今回は正真正銘、I/Oデバイスの1つであるシリアル通信(UARTともいいます 図1)の割り込みについて考えてみましょう。

photo 図1 LPC1114のブロックダイヤグラム。赤線で囲んでいるところがシリアル通信(UART)

割り込みを使わないプログラム

 前回と同様に、以下2つのプログラムについて考えてみましょう。

1:	#include "mbed.h"
2:	DigitalOut myled(LED1);
3:	int main() {
4:    	while(1) {
5:        		myled = 1;
6:        		wait(0.2);
7:        		myled = 0;
8:        		wait(0.2);
9:    		}
10:	}
List1

 List1はおなじみの発光ダイオード(LED)点滅のプログラムですね。新規にプログラムを生成するときに、テンプレートを“Blinky LED Hello World”に指定すれば自動的にmain.cppとして生成されるソースコードです。

 コンパイルして成功すればバイナリファイル(XXX.bin)が生成されて、ローカルPCにダウンロードされます。これをLPC1114に書き込めば、ターゲットマイコン上でLEDが0.4秒間隔にて点滅します。書き込み方法や回路図については、連載の第2回第3回を参考にしてください。

1:	#include "mbed.h"
2:	Serial pc(USBTX,USBRX);
3:	int main() {
4:    	char c;
5:    	while(1) {
6:      	  c = pc.getc();
7:      	  pc.putc(c);
8:    	}
9:	}
List2

 List2はマイコンのシリアルポートが受信した文字をそのまま送り返すプログラムです。これも前回のタイマー割り込みのところでも出てきましたので、説明は割愛します。

 これらの2つのプログラムを1のマイコン(LPC1114)で動かすことを考えてみましょう。動作としては発光ダイオードは0.2秒間点灯させ、その後0.2秒間消灯させます。これを繰り返します。またマイコンのシリアルポートに入力された文字はいつでも送信元に戻ってきます。これらの動作を並行して実行させたいわけです。

 これらを実現するのにネックになる箇所を検証していきましょう。まずリスト2の6行目の c=pc.getc() ですが、このメソッドは受信した文字をcに代入するものです。ただ何か文字を受信するまでそこで処理が止まります。またリスト2の6行目と8行目の wait() は指定した時間、そこで処理を止める関数ですが、その間は他の処理ができなくなってしまいます。

 これらを解決するために前回はTickerによるタイマー割り込みを使いました。Tickerで一定間隔で割り込み処理関数を呼び出し、その中で発光ダイオードの点灯・消灯を反転させました。今回はシリアルデバイスの割り込みを使って、これら2つのプログラムの並行動作を実現してみます。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.