SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

たった5つのルールではじめるC言語開発

マジカルボックスのプログラムを読み解く 1


  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (44.7 KB)

 これまでの12回で、開発環境の使い方と、C言語の文法のうち5つのルールを勉強しました。この知識をもとに、マジカルボックスのプログラムを読み解いてみます。学んだ文法が実際にどのように使われているかを見ることで、より一層理解を深めることができます。

  • このエントリーをはてなブックマークに追加

マジカルボックスの動作についておさらいしよう

 マジカルボックスは、以下の3つの仕事をします。

  1. 冒頭4回のスプーン音の間隔を計測する
  2. その後計測間隔ごとのスプーン音の有無によって、4打相当の命令コードを読み取る
  3. パソコンに送信する

 これらの仕事を実現するために、以下の4つの機能を使います。

  1. スプーンの音を読み取る
  2. LEDを点灯させる
  3. 時間を計測する
  4. データを送信する

まずはプログラムの構造からみてみよう

 OS上で動作するようなアプリケーションプログラムでは、基本的にはOSの世界のルールにしたがって動作手順を記述すればプログラムは完成します。しかし、マジカルボックスのような小規模でOSもなにもないような組み込みソフトウェアでは、この動作を実現するためのハードウェア要件(なにが必要か)も考える必要があります。まずアプリケーションを動作させる土台(世界)から作ってやる必要があるのです。

 マジカルボックスでは、前記4つの機能に対応して4つのハードウェア資源を使用しています。

  1. 入力ポート
  2. 上記Aのスプーンの音を読み取る機能は、入力ポートを読むことで音があったかどうかがわかる回路(仕様)になっています。

  3. 出力ポート
  4. 上記BのLEDは、出力ポートにそれぞれ接続されています。

  5. タイマ
  6. 上記Cの時間の計測に使用しています。マジカルボックスでは、計測用に1つ、時間待ち用に1つ、合計2つのタイマを使っています。

  7. シリアル通信
  8. 上記Dのデータ送信の機能で使用しています。マジカルボックスではマイコンのシリアル通信を利用して、それを回路でUSBに変換してパソコンに送信しています。

 マイコンのハードウェアを使うには、それぞれに専用の駆動プログラムを対応させます。この専用の駆動プログラムのことを一般にデバイスドライバと呼びます。デバイスドライバは、ハードウェアの世界と装置の動作を記述したプログラム(アプリケーション)との橋渡しをする役目を担っています。

 ここまでの内容をまとめると、マジカルボックスに必要なプログラムは以下のようになります。

マジカルボックスに必要なプログラム
1. 動作を実現するプログラム(アプリケーション) a. スプーン音の間隔を計測するプログラム
b. 命令コードを読みとるプログラム
c. パソコンに命令を送信するプログラム
2. 必要なデバイスドライバと使用するハードウェア d. スプーン音ドライバ ← 入力ポート
e. LEDドライバ ← 出力ポート
f. ストップウォッチ(時間計測) ← タイマ
g. データ送信ドライバ ← シリアル通信

 それぞれに対応したプログラムを作成して、ソフトウェアの部品を揃えます。部品を組み立てれば、目的の動作をするソフトウェアができあがります。図1にソフトウェア部品を構造にまとめたものを示します。

図1:マジカルボックスのプログラム構造
図1:マジカルボックスのプログラム構造

 最下層はマジカルボックスで使用しているハードウェアです。スプーン音を拾うための超音波検出回路が入力ポートに、表示LEDが出力ポートに、パソコンのUSBに接続する回路がシリアル通信に接続されています。あとは時間を計測するためのタイマです。

 これらマイコンのハードウェア資源には、それぞれ対応したプログラムを用意しています。それが中段に位置するデバイスドライバです。

 最上段にあるアプリケーションの層には、マジカルボックスの動作を決定するプログラム群が位置しています。これらは動作を実現するために、たとえば音を待ったり、LEDを点灯したりする必要があります。しかしここから直接ハードウェアにアクセスしたりはせず、SOUND(音)であるとかLEDであるとかのデバイスドライバを呼び出すようにしています。

 たとえば一番左のLEDを点灯したいときは、「LED」というデバイスドライバに、「一番左のLEDを光らせよ」と命令を出します。このとき、"一番左のLED"が、どのポートに接続されているのか、1で光るのか0で光るのかなどはアプリケーションは一切知る必要がありません。それはデバイスドライバが解決してくれるのです。このような構造にすることで、ハードウェアの仕様変更などに強いプログラムにすることができます。デバイスドライバは、単にハードウェアを制御するだけでなく、ハードウェアを抽象化する目的も担っているのです。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ソースプログラムを手に入れよう

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
たった5つのルールではじめるC言語開発連載記事一覧

もっと読む

この記事の著者

舘 伸幸(タチ ノブユキ)

NECマイクロシステム株式会社 勤務NPO法人SESSAME 所属開発ツールのソフトウェア開発を経て組込みソフトウェア開発に従事。プライベートにも半田ごては手放さない。2006年からSESSAME に参加。若い世代に物を作る楽しさを伝えていきたい。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3732 2009/03/26 17:23

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング