December 04, 2007

Super Sylphide 進捗状況(14) -- McBSP(SPI)におけるCPU割込とEDMAの協調

製作中のオートパイロットシステムsuper Sylphideですが、DSP上で動作するプログラムのブラッシュアップを進めています。その中でDSPにかかるCPU割り込みが予想外に多く、処理負荷を上げていることがプロファイラによって判明しました。これは以前の記事『DSP/BIOSを利用した割込みMcBSP(SPI Slave)』にもあるとおり、SPIモードで利用しているMcBSPにおいて、4bytesつまり32bits受信するたびにCPUに割込みをかけて受信後の処理をしていたためです。そこで今回はCPU割り込み+CPUに負荷をかけることなくメモリの転送が行えるEnhanced DMA(EDMA)を協調させることによってCPU負荷軽減を目指してみました。

ここで、なぜEDMA単体ではなくCPU割込みと協調なのか、と疑問を持たれる方がいらっしゃるかもしれません。SPIやI2CといったCPUから見れば非常に低速なペリフェラルに対して適用されるDMAは、複数バイトをブロック処理するために使われることが多く、電源ONから電源OFFまでDMAは起動しっぱなし、CPU本体はDMAの起動、停止をいちいち行わない、というのが普通であると思います。特にターゲットとしているDSPのTMS320C6713に搭載されたEDMAは単体でピンポンバッファ(ダブルバッファといったほうが一般的でしょうか)を構成できるので、CPUがEDMAの起動、停止を動作中に変更する必要は全くありません。

ところが残念ながら以前の記事でも書いたとおり、McBSPをSPI互換モード(クロックストップモード)で動作させると、ハードウェアでは複数バイトで意味を構成するフレーム転送がサポートされません。そこでフレームの頭だしをソフトウェアで行うために、CPU割込みが必要となってきます。CPU割込みによって頭だしが行えたらCPU割込みを停止、EDMAを起動して1フレーム分溜まるまでEDMAを動作、EDMAによる1フレーム受信完了後、EDMA終了割込みによってCPU割込みを復活という動作によって解決を図りました。図で示すと、以下のような動作になっています。

McBSP_EDMA_cooperative.png

このアイデアを実装すると公開中のソースコードのようになりました。この記事を書いている時点でのCVSの管理番号はmain.cpp.1.34です。
ひとつ注意書きをしておきますと、EDMAとCPU割込みを同時に行うサンプルコードが探した限りでは見つかりませんでした。そのためコードの大部分は試行錯誤によって書かれており、動作が怪しいところが依然としてあります。
怪しい部分は、CPUが高負荷になった時点でMcBSP受信イベントがEDMAに伝わらずにEDMA割込み完了がおこらず、またEDMA動作時にはCPU割込みを無効にしているため、デットロック状態が発生していることです。しかもそのような状態に陥った際は、McBSPの受信レジスタ(DRR)に対してCPUから直接アクセスをすることによって、デットロック状態が解消(McBSPの受信イベントがEDMAに伝わるようになる)されるようなので、コードにはそのような対処法を追加してあります。おそらくEDMA、キャッシュ、McBSPあたりが臭いとにらんでいますが、現在解決には至っていません。この問題についてご存知の方がいらしたら情報を待っております。

最後に、このコードを書くにあたって2点ほど苦労しました。参考になる方がいらっしゃるかもしれませんので記録をつけておこうと思います。

一つはEDMA先がL2キャッシュが効いているCS0上のSDRAMであるため、EDMAを起動する以前にCACHE_wbInvL2()やCACHE_wbL2()によってキャッシュの掃除をしておく必要がありました。これを忘れると、SDRAMに受信内容が書き込まれていなかったり、送信内容が古いままになってしまいます。

もう一つはEDMAとMcBSPの初期化手順です。spra488『TMS320C6000 McBSP Initialization』に厳密な規定があり、これを守らないとEDMAがうまくかかりません。ここには先述のより一般的な使用方法であるEDMAが電源ONからOFFまで起動しっぱなし、というサンプルコードがあり、今回のコーディングはこのサンプルコードをもとに行いました。

※その後、I/O拡張基板の設計をしました。
※※随分と時間がかかりましたが、通信の問題が解消しました。

11:00 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/606

December 13, 2007

学生室内飛行機コンテスト

航空機について学んでいる大学生・大学院生への教育活動として、手作りの室内飛行機/飛行船の競技会『全日本学生室内飛行ロボットコンテスト』が今年も開催されるようです。今年で3回目のこの競技会は年々規模が大きくなるようで、先日の申し込み締切りの時点では国内、そして海外から約40チームがエントリしたと聞いています。前回の大会ではニュースに取り上げられていたようですね。

競技会のルールの概略を紹介すると、体育館において手作り小型ラジコン飛行機または飛行船を飛ばし、その機体に搭載された無線ビデオカメラで地面の様子を撮影・転送、地面には文字の書かれた紙が置かれているのですが、その文字を人間がどれだけ判読できるかで主に勝敗が決定します。飛行機について言えば、求められる性能は低速飛行時の安定性や最小旋回半径といったところではないでしょうか。文字が判読できるかどうか、以外にも、機体の独創性やプレゼンテーション(今年から英語のようです)なども評価対象のようです。

さらに今年からは各チーム進捗状況報告を兼ねてブログをつけることがルールに盛り込まれたようです。興味を引かれる内容がありましたら、その際はこちらのサイトでも取り上げたいと思います。開催は来年3月で、応援していきたいと思います。

※その後、各チームの進捗状況を一度にさらう方法を記事にしてみました。

09:25 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/607

December 18, 2007

Chumbyがやってきた!!

Chumbyをご存知の方はいらっしゃいますか? まずは下の写真をご覧あれ。

chumby.jpg
画面の周りは、ふにふに。

これは無線LANとタッチスクリーン、Flashの実行環境がついたオープンソース(ソフトのみならずハードも)コンピュータです。現時点では179ドルで米国国内の開発者向けリリースのみが行われている状況ですが、この度、米国にいる友人(彼は2008年1月10日にちょっと有名になる予定です)に頼んで晴れて入手に至りました。

何をしようかはとりあえず未定なのですが、僕のもっているハードウェア/ソフトウェアの知識を生かして、何か楽しいことができたらいいなと思っています。購入を手伝ったくれた友人曰く、これでSkypeが動けば、遠距離恋愛グッズとして役に立つと仰せでしたが、Skypeのソースコードが公開されていないこと、ハードウェアのスペックが足りない(ARM 350MHzはキツイ)ので、少々躊躇しております。もしこんなもの作ったらどうよ、というのがありましたら、是非是非コメントお待ちしております。

ChumbyにFTDIのUSBシリアル変換(例えばFT232RL)をつなげてなにかしようと企んでいます。

22:23 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (7) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/608

December 22, 2007

MyRemixによるブログRSSの統合

先日の記事では、学生による室内飛行機のコンテストがあるよ、という紹介をしましたが、その中で各チームが進捗状況をブログにするルールについて触れました。その進捗状況は気になるところなので、是非とも欠かさずチェックをしたいところです。しかし参加チームが40近くもあるので、いちいち各ブログを回って、RSSのURLを調べて、それをリーダーに登録、というのは少々面倒のです。
そこで、今回の記事では複数のRSSをまとめて1つのRSSにする方法について検討してみました。

せっかくなので友人のH社長が作った『MyRemix』を使ってみようと思います。このツールはWeb上でもかなり取り上げられているようで、ニュースサイトでH社長の顔を拝むことができます(笑)。
で、そのMyRemixの機能ですが、マッシュアップツール、つまりはWeb上にある様々なリソースを混ぜることによって、独自のRSSやメールといったアウトプットを作ることができるツールです。例えば、ブログのRSSやMixiの日記、サーチエンジンの検索結果をまとめ、さらには特定の単語を含む記事のみに絞ったRSSを作る、といった使い方ができます。
従来このようなことをするためには自分でプログラムを書く必要がありましたが、MyRemixではそれがWeb上でできてしまいます。下の画像をご覧あれ。

myremix.png

マウスのドラック&ドロップ操作でどんどん作れます。このなかなか直感的なインターフェイスはFlashで作ってあるそうです。

最後に、MyRemixを使って例の室内飛行機コンテストに出場するチームのブログをまとめたRSSを公開したいと思います。なお認証制限がかかっているものや、RSSを提供していないサイトについては除外せざるを得ませんでした。

22:48 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (1) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/609

December 30, 2007

Othelloプログラム再び(RubyからC++へ)

そろそろ年が明けてしまいますが、決して年末で更新をサボっていたわけではありません。ちょっと悪性の風邪を引いてしまいまして、ここ1週間体調が非常に悪い状況が続いています。元気に年を越したいものですが…。

近況はさておき、記事を更新したいと思います。かなり以前にRubyでOthelloのプログラムをつくりましたが、計算速度が遅くて先読みがあまりできなかったこと、また別に今後を見据えた事情がありまして、再度C++で作り直しています。とりあえず以前作ったものと同じ動作をするバージョンをこさえてから、色々戦略を練りなおそうと考えているのですが、RubyをC++に移植するのはかなり大変でした。

とりあえず作業中のコードを散らかしておきます。

特にオブジェクト指向がらみが鬼門でした。Googleの日本語で調べた限りですと、オブジェクト指向なC++で書かれたオセロプログラムは少ないようです。計算量が必要になるので、確かにオブジェクト指向的にするとオーバーヘッドが大きいのが理由かとは思いますが、今回はあえてオブジェクト指向を意識して書いています。それというのも元のプログラムがRubyなので、オブジェクト指向を意識して書き直さないと途中で破綻をきたしそうという事情があったためです。途中でGCがとても欲しくなる病気にかかりましたが、なんとか時間を費やすことでメモリがあふれなくなりました。

なお盤面の評価関数クラスの名前があれですが、何かあったときの言い訳です(笑)

※その後、評価関数の実装が完了しました。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/610