連載
» 2006年08月08日 00時00分 公開

T-Engineプログラミング入門(3):必修技術:タスク制御とチャタリング対策 (1/5)

今回は基本中の基本であるタスク制御と、「チャタリング」という組み込みならではの問題への対処法を解説する

[中村 大真 パーソナルメディア株式会社,@IT MONOist]

 前回は「計数器」プログラムを例に、割り込みを使ってボタンが押されたことを検出する方法を紹介しました。今回はもう少し高度な例として、「スロットマシン」を作ってみましょう。

 「計数器」プログラムでは、「割り込みハンドラ内で数を数える」という単純な処理を行いました。しかし、より複雑な処理(特に待ち時間の発生するような処理)になると、割り込みハンドラ内で行うことはできません。そのような場合は、割り込みハンドラで処理するのではなく、割り込みハンドラからタスクを起床させて、そのタスクの中で待ち時間を伴う処理を行うようにします。

 確かに、割り込みハンドラ内で無駄なビジーループを行えば、待ち時間を稼ぐことは可能です。しかし、ビジーループ中はCPUがほかの処理を行えず、リアルタイム性能が低下します。一方、タスクの中で待ち状態に入ると、その間CPUはほかのタスクを実行できるので、CPU時間を有効に使ったリアルタイム処理が可能です。

 この「ハンドラからタスクを起床させる」という技法は、組み込みの世界・T-Engineプログラミングでの常とう手段です。ほとんどありとあらゆる場面で使われるといっても過言ではありません。今回はスロットマシンのプログラムを通して、この技法をしっかりマスターしましょう。

スロットマシンの仕様決定

 スロットマシンはご存じのとおり、図1のようなものです。

スロットマシン 図1 スロットマシン
・ スタートレバーを下げると、絵柄の付いたドラムが一斉に回転を始める
・ 各ドラムのストップボタンを押すと、そのドラムの回転が遅くなり、しばらくすると完全に停止する

 スタートレバーやストップボタンの検出は、前回と同じように割り込みを使うことにします。しかし今回は、スタートレバーやストップボタンを検出した後、ドラムを回転させたり回転を遅くしたりする処理に待ち時間が伴います。そこで、割り込みハンドラからタスクを起床させて、そのタスクの中でドラムの回転を制御することにします。

 また、もう1つ大切なのは「各ドラムの動きはそれぞれ独立していて、ほかのドラムに影響を与えない」という点です。例えば、1つのドラムを止めると、その分だけ処理が軽くなります。すると、まだ止まっていないほかのドラムの回転速度が上がってしまいがちです。そこで、回転速度が負荷の軽減に影響されないようにプログラミングする必要があります。そういう場合に便利なのが、マルチタスクです。各ドラムの回転を独立したタスクに担当させて、回転速度を個別に制御するようにします。

 スロットマシンの各パーツは、本連載を通じて利用しているTeaboardのボード上にあるデバイスに割り当てることにしましょう(図2)。今回はスロットマシンの中央のドラムは割愛して、左右2つのドラムだけにします。

今回使うTeaboard上のデバイス 図2 今回使うTeaboard上のデバイス

スロットマシンのパーツ Teaboard上のデバイス プログラムからの制御方法
左ドラム 左7セグメントLED アドレス:0x16100002
右ドラム 右7セグメントLED アドレス:0x16100000
左ストップボタン 左プッシュボタン 割り込み定義番号:164
右ストップボタン 右プッシュボタン 割り込み定義番号:165
スタートレバー 一番右のトグルスイッチ
(SW7)
割り込み定義番号:182
(アドレス:0x0021c224 bit22)

 また、7セグメントLEDに表示するパターンは、前回は0から9までの数字でした。今回は図3に示す6通りのパターンを繰り返し表示して、LEDの外周をくるくる回る効果を出すことにします。

7セグメントLEDに表示するパターン 図3 7セグメントLEDに表示するパターン
       1|2|3|4|5 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.