Tech と Culture

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

motion JPEG再生

デバイスドライバデバッグに苦労してました。
原因は、ioctlでデータを渡す構造体のサイズが大きすぎて、そこでページフォルトが起きていました。
8bitキャッシュのデータを一度に渡そうとしていました。ページサイズ相当のデータをいきなり渡していたら、ページフォルトが起きても当たり前です。。。。
しかし、いきなりOSごと落ちてしまうのでデバイスドライバデバッグはかなり難しそうです。
こんな簡単なデバイスドライバでも問題発見まで苦労しました。商品レベルの平行動作があるデバイスドライバデバッグは相当難しいのだろうなと思います。

バグが取れたところで、続きを。
デバイスドライバのSCANデータを渡す部分を256x4Byte丸ごと渡すように変更しました。
devicedriver.jpg
最初にREADY信号をチェックしてからREADYであれば、データをForループで順に書き込んでいきます。
READY信号のループをデバイスドライバ側で行うのか、アプリケーション側で行うのが良いか自分には分からなかったのでとりあえず、デバイスドライバ内で行っています。少し危険な雰囲気もありますが、競合はおきないのでまあ問題ないかと考えました。

以前4byte(32bit)毎にアプリケーションからデバイスドライバに送っていました。データ4Byte毎にコンテキストスイッチが起きることになります。今回はコンテキストスイッチの発生が 1/256 に減っています。この影響がどれぐらいあるかをVGAサイズの画像を表示して確かめました。

最初がソフトウェア表示、2番目が以前の4Byte毎のデータ転送、3番目が今回の256x4Byteの転送です。

やった!!! 劇的に表示が速くなりました。殆ど一瞬で書き換えられています。
これは動画も期待できる。

という訳で動画表示です。割り込みハンドラーについてよく分かっていないので、マーカーレジスタが書き込まれたら次のクロックで00を書き込むモードをハードウェアに作り、割り込みは考えずに表示させます。



最初がソフトウェアによるQVGAサイズのmotionJPEG表示です。動画というよりも紙芝居。。。。
後半が今回のデバイスドライバを用いてハードウェアにSCANデータを送ったものです、、、、、

やったーーーーー!!!! 動画表示成功!!!!
カメラが粗いですが、motionJPEGなので実際にはかなり綺麗な動画が表示されました。
ばんざーーーーい!!!!