検索
連載

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

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

Share
Tweet
LINE
Hatena

シリアルデバイスの割り込み

 mbedが提供するSerialクラスのライブラリーを使えば、シリアルポートがデータを受信したときと、シリアルポートが送信可能なときに、割り込みを掛けることができます。

 受信割り込みを使うと、CPUがシリアルポートのデータ受信をいちいち監視したり、待つことなくCPUはデータ受信をシリアルデバイス側からの割り込みで知ることができます。ですからCPUはこの間、別の処理ができることになります。

 これに対し送信可能なときの割り込みは、一般的にシリアルポートの通信速度はCPUに比べて遅く、シリアルポートに1文字の送信要求を出してから送信終了までCPUは待たされます。シリアルポートでなるべく速くデータを送ろうとすれば、送信の終了を待って即座に次の文字の送信要求を出さなければなりません。そこでシリアルデバイス側から割り込みによって、この送信終了をCPUが知ることができれば、送信終了を待っている間にも別の処理が可能となります。

 図2はSerialクラスのAPIサマリーです(ARM mbed handbookより)。Attachというメソッドを使って、割り込み処理ルーチンの登録と割り込み要因を指定します。第一引数で割り込み処理ルーチンのアドレスを指定します。第二引数で割り込み要因を指定します。第二引数に Serial::RxIrq とすれば受信割り込み、Serial::TxIrq とすれば送信割り込みとなります。

photo
図2 SerialクラスのAPIサマリー

割り込みを使ったプログラム

 それでは、上で示したSerialクラスの割り込みを使ったプログラムを見ていきましょう。

1:#include "mbed.h"
2:DigitalOut myled(LED1);
3:Serial pc(USBTX,USBRX);
4:void pc_rx () {
5:    pc.putc(pc.getc());
6:}
7:int main() {
8:    pc.attach(pc_rx,Serial::RxIrq);
9:    while(1) {
10:        myled = 1;
11:        wait(0.2);
12:        myled = 0;
13:        wait(0.2);
14:        }
15:}
List3

 4行目から6行目までが割り込みによって呼び出される、割り込み処理関数です。pc.getc()でシリアルポートが受信した文字を受信します。受信した文字は戻り値として取得できますが、それをそのままpc.putc()の引数としています。この行だけでシリアルポートで受信した文字を送り返す処理をしているのです。

 このプログラムはまずmain関数から実行されますので、その初期処理の部分で割り込み処理ルーチンと割り込み要因の設定を行っています。8行目がこれにあたります。pc.attachの第一引数で4行目から始まる割り込み処理関数のアドレスを指定しています。第2引数でSerial::RxIrqと指定していますので、シリアルポートがデータを受信するたびに、第一引数でしていた割り込み処理関数pc_rx()が呼び出されます。

 その後に続く9行目からの永久ループでは発光ダイオードの点滅の処理を行っています。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る