「これって本来マイコンがするべき仕事なの?」に注目−ザ・組み込み−ソフトウェアのハードウェア化(5)(1/4 ページ)

アセンブリレベルの解析でプログラムのオーバーヘッド部分が見えてくる!! ソフトウェアのハードウェア化の考え方とは?

» 2008年12月17日 00時00分 公開
[鳥海佳孝 設計アナリスト,@IT MONOist]

 前回「意外と深い、マイコン版『Hello World!!』を侮るなかれ」では、ユーザーアプリケーションである「Hello World!!」をコンパイルする環境を整え、小型CPUで動作可能なLinux OS「uClinux」を載せたH8マイコンの上で、自作プログラム(Hello World!!)を動作させることに成功しました。

 ここまでくれば、OSの載っていない“裸のマイコン”上でも、“OSの載ったマイコン”上でも、さまざまなアプリケーションを実行できるはずです。

 後は、「アプリケーションを実行させたい人のアイデア次第……」というのが、恐らく通常の“ソフトウェア”の切り口から見た組み込み開発だと思いますが、本連載の主題は“ソフトウェアのハードウェア化”です(忘れないでください)。

 というわけで、今回から長らくお待たせしていたソフトウェアのハードウェア化について具体的に話を進めていくことにします。そう、今回からがある意味“本当のスタート”だと思ってください。それでは、前置きはこれくらいにして、早速ソフトウェアのハードウェア化の検討に入りましょう!

ソフトウェアのハードウェア化を検討するサンプルプログラムの準備

 まず、ソフトウェアのハードウェア化を検討するに当たり、題材として用いる(検討対象の)プログラムを紹介します。

 今回は、ハードウェア化の話を分かりやすくするために、いったん裸のマイコン上で動作するプログラムを使用します。「せっかくuClinuxをAKI−H8/3069Fに載せたのに!」と怒らないで読み進めてください。

 では例によって、「『はじめる組込みLinux』サポートサイト」から以下のプログラムをダウンロードしてください。これらはマザーボードのLCDに時計(時:分:秒)を表示するプログラムです。

 ダウンロードしたこれらのファイルを同じディレクトリに配置します。これまで(過去の連載)の作業で、すでにrootのホームディレクトリの下に「3069F」というディレクトリが作成されているはずですので、今回はそこに配置することにします。

 以下のように、「3069F」のディレクトリへ移動して、「mv」コマンドで先ほどダウンロードした「Makefile.lcd_clock」の名前を「Makefile」に変更します。

# cd ~/3069F
# mv Makefile.lcd_clock Makefile 

 続いて、リスト1にさまざまなファイルをコンパイルできるように、ファイル名をFILE変数に入力するように変更した「Makefile」を示します。各自、必要に応じて「Makefile」を変更してください。

FILE=lcd_clock
all: $(FILE).elf
        h8300-linux-elf-objcopy -O srec  $(FILE).elf $(FILE).mot
$(FILE).elf:  rom_start.S 3069rom.x $(FILE).c h8_sample.h h8_lcd.h
        h8300-linux-elf-gcc -O2 -Wall -mh -mint32 -T 3069rom.x \
        -nostartfiles rom_start.S $(FILE).c \
        -Wl,-static \
        -o $(FILE).elf
$(FILE).S:  rom_start.S 3069rom.x $(FILE).c h8_sample.h h8_lcd.h
        h8300-linux-elf-gcc -O2 -Wall -mh -mint32 -T 3069rom.x \
        -nostartfiles $(FILE).c -S \
        -o $(FILE).S
clean:
        rm -f $(FILE).elf $(FILE).mot
リスト1 変更を加えたMakefile(→ダウンロードはこちら

 ここまでの準備ができたら、「make」コマンドでコンパイルします。

# make 

 コンパイルが成功すると、カレントディレクトリに「lcd_clock.mot」が生成されます(万一、コンパイルできない場合はH8のコンパイラのコマンドパスが通っているか、または必要なファイルがすべてそろっているかなどを確かめてください。コマンドパスに関しては、連載第3回「山あり谷あり、非力なマイコンでuClinuxを動かすべし」を参照のこと)。次に、AKI−H8/3069Fのマイコンを書き込みモードに設定して、USB−シリアル変換ケーブルをつないで、AKI−H8/3069Fの電源を入れます。

 それでは、「h8write」コマンドでAKI−H8/3069Fのマイコンに「lcd_clock.mot」を書き込みます(書き込み方法の詳細は、連載第2回「えっ、シリアルポートがない!! ターゲットボードとの接続」を参照のこと)。

# h8write -f20 -3069 lcd_clock.mot /dev/ttyUSB0 

 書き込みが成功したらAKI−H8/3069Fの電源をいったん切って、通常モード(連載第2回を参照)に設定し直して、再度電源を投入します。これでマザーボード上のLCDに時計の値が出力されるはずです。

 今回利用したソースを参考にすれば、LCDの表示やタイマー割り込みを使った時間計測の仕組みを理解できるはずです。また、このソースを利用して独自のアプリケーションを作成したり、このテクニックを自作のアプリケーションに応用したりすることでさらに理解が深まることでしょう……と、まとめのようになってしまいましたが、ここからが本番です! 次に進みましょう。

LCD時計プログラムの分析

 前述までの準備が完了したところで、ソフトウェアのハードウェア化を検討していきます。まずは、先ほどAKI−H8/3069Fのマイコンに書き込んだプログラムを分析することからはじめましょう。

 ソフトウェアの肥大化問題が深刻化する中、従来のソフトウェアのハードウェア化の観点では、

  • 組み込む機器への物理的な大きさの問題
  • ハードウェア化するためのコストの問題

などがあり、マイコンの外側に専用ハードウェアを搭載することができ難い事情がありました。しかし、最近では次回で取り扱うFPGAがかなり身近なデバイスになってきましたので、専用ハードウェアという解が現実味を帯びてきたと筆者は感じています。

 では、ソフトウェアの肥大化を解決する際にプログラムのどこに注目したらよいのでしょうか?

 それは、

「これって本来マイコンがするべき仕事なのか?」

という部分です。

 今回の題材であるLCD時計プログラムでいうと、LCDの特性から、「LCDの表示のために“単に”時間を稼いでいる部分(以下、時間稼ぎ)」がそれに相当すると判断できます。

 具体的には、「h8_lcd.h」の

  • LCD_Init関数の中にある_nop()やwait()、wait20us()
  • LCD_Output関数の中にある_nop()やwait()、wait20us()

の部分です。

 これらの関数を実行している最中は、その時間が来るのをひたすら待っているので、当然のことですが、マイコン(CPU)は割り込み以外のほかの仕事はできません。本来あるべきCPUの動きとしては、「この仕事をやっておくように!」と周りに依頼だけしたら、別の本来の仕事をして、後はその家来たち(ここでは周辺のペリフェラル)が忠実に仕事をしてくれればよいわけです。こうすればCPU本来のいわゆる“システムのシーケンスの制御”に専念できるはずです。

 いままでの組み込み機器としてのマイコンは、前述したコストの問題などがあり、本来の仕事以外(シーケンス制御)のこともしなくてはならなかったので、“時間稼ぎ”などの仕事も行わなければなりませんでした。詳細は次回に譲りますが、本連載では本来マイコンでやらなくてもよい部分をFPGAに肩代わりしてもらいます。

       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.