Tech と Culture

テクノロジーとカルチャー

gdbserver

さてさて、色々問題はありますが、VMware上のCentOSの方にISE10.1をインストールしてFPGAにマッピングをおこないました(ISE11.1を最初にインストールしましたが、現在のgrlibのスクリプトでは動かないようです。多分少し修正すれば動くのだと思いますが、安全のために実績のある10.1をインストールしました)。

以前と同様に、80x80のjpegをハードウェアに直接送るプログラムを作り、grmonで転送して実行してみると、、、
CA390163.jpg


画面左上に絵が表示されました!
このprogramは、OS無しで直接データを送っています。これでハードウェアはきちんと動いていることが分かります。
そこで、次は、djpegの方を修正してムービーをデバイスドライバを通してハードウェアに送ってみます。

jidctint.cの中のidct処理終了時のところにデバイスドライバを記述して出力します。
ここで、この関数は、出力部分が2箇所ありますので、2箇所にデバイスドライバ出力が必要なことに注意します。

また、djpeg.cのmainの方でデバイスドライバをオープンする処理を入れます。以前のjdcolor.cでデバイスドライバをオープンにしている部分や、デバイスドライバ出力している部分は省きます。これでムービーが表示されるはずとおもって実行すると何も表示されずにプログラム実行がすぐに終わります。

このような時は、gdb を用いてプログラム内部をさぐります。
FPGA上の組み込みプロセッサにおいて、gdbを直接実行するのは負荷が高いために gdbserver というものを用います。これまでも gdbserverは何度も使ってきていたのですが、一度もエントリに載せていないのでここで記述しておきます。

gdbserverとは、ホスト上のgdbと通信するための最低限の機能を持つプログラムです。ターゲットボードのリソースをあまり消費しないで動作することができますので、組み込みlinuxのアプリケーションデバッグに良く使われるものだそうです。

まず、linuxをコンフィグレーションする際に、gdbserverにチェックボックスを入れておき、linuxイメージファイルにgdbserver実行ファイルが含まれるようにしておきます。
そして、ターゲットボードでgdbserver越しに実行します。
実行の前にターゲットボードのIPアドレスが必要になりますので、 /sbin/ifconfig を実行してメモしておきます。その後 gdbserver を実行します。

#[target] gdbserver :1234 /bin/djpeg xxx.mjpeg
Process /bin/djpeg created; pid = 31

メッセージが返ってきて、gdbの接続待ちになります。
ここで、1234 は通信に使うポート番号です。また、プログラム指定は、 /bin/djpeg のようにフルパスで指定しないと動かないようです。

ホスト側では、-g オプションを付けた実行ファイルが必要になりますのでコンパイルしておきます。私は今のところすべてのプログラムに -g オプションをつけてコンパイルするように指定していますので、ただ単にプログラムのあるディレクトリ $SNAPGEAR_HOME/user/jpeg-6b に移動するだけです。
このディレクトリで クロスターゲット用のgdbを実行します。

#[host] sparc-linux-gdb djpeg

これでgdbが立ち上がります。その後 gdbserverと接続します。
(gdb) target remote 192.168.24.6:1234

IPアドレス:ポート番号を指定します。

(gdb) break main
(gdb) cont

これで、通常の gdb と同じようにプログラムの実行がはじまり、main関数入り口でストップします。
後は通常の gdb と同じようにステップ実行したり、変数の値を表示させたりしてデバッグします。

以上のように gdb 上でデバッグすると単純なケアレスミスだと言うことがわかりました。

そのミスを修正して実行すると、、、、、
CA390162.jpg

無事に動画が再生されました。
今回から、画面サイズがMCU単位のみ(パッディングが必要なサイズに対応しない)ため、画面サイズをQVGAにしました。当然4倍の処理時間がかかります。
また、デバイスドライバで 8bitx8個のデータ毎にまとめて送っていますのでここにもオーバヘッドがかなりあります。
よって動画の再生フレームレートは非常に遅いです。
しかし、ここは設計の中間マイルストーン確認のためですので問題はありません。

さあ、次は、以前コーディングしたIDCT部分を二つとダブルバッファメモリを二つ挿入だ!と行きたいのですが、前回のエントリにも書いたように少し問題がでてきてしまいました。。。。

まあ、山あり谷ありというところです。こんなものでしょう。いずれにしろムービーが動くとホッします。
これで、YCbCr-RGB変換とupsample部分がハードウェア化されました。