Super Sylphide 進捗状況(12) -- DSPプログラムROM化

オートパイロットシステムsuper Sylphideですが、航法(INS/GPSナビゲーション)部分がほぼ完成したので、プログラムをROM化しスタンドアローンで動作するようになりました。現在、倍精度浮動小数点(double)で、18状態量(位置で5、速度で3、姿勢で4、センサバイアスで6)、カルマンフィルタの誤差共分散行列では16 x 16のアルゴリズムが100Hzで回っています。
そこで今回は、作成したDSPプログラムをROM化する行程をまとめておこうと思います。

長くなりそうなので、トップページからこられた方を続きをどうぞ。

※その後、Super Sylphide絡みでTime Keeperのファームウェアを公開しました。

以降、DSPはSuper Sylphideに搭載されているTexas Instrumentsの浮動小数点DSPであるTMS320C6713BPYP200を仮定しています。恐らくアーキテクチャが近いC67XX系でしたら同じ手順でいけるのではないでしょうか。またターゲットとなるROMはFlash ROMでCE1に16bit幅で接続されているものとします。
では以降、ROM化の流れを順を追って説明したいと思います。

まずはFlash ROMに書き込むイメージを作成します。
イメージの作成では、実行したいDSPプログラムにブートローダを加えてコンパイルし、そのでできたオブジェクトからブートテーブル(どこの内容をどのアドレスに配置するか)を生成しつつHexファイル化します。
ここでブートローダやブートテーブルが必要になる理由を軽く説明しておこうと思います。DSPの初期化は少し変わっていて、ハードウェア的に組み込まれているDSPのブートプロセスは、Flash ROMから先頭1KByteしかDSP内蔵RAMにコピー、実行されません。そこでこの最初に読込み・実行がされる1KByteの領域に、プログラムの実行の際に必要となる全体のメモリ配置を行うためのソフトウェアとしてブートローダを仕込んでおく必要があります。さらに、ブートローダがどのようなメモリ配置を行えばいいか参照するためにあるのが、ブートテーブルです。
今回利用したブートローダはboot6713.asmで、メモリ関係のレジスタの初期化後、メモリ配置を行っています。ブートローダを本体のコードに組み込むためのリンカスクリプトはboot6713cmd.cmdです。またブートテーブルの生成、ならびにHexファイル化にはTI純正のhex6xというプログラムを使っていますが、そのコマンドスクリプト(hex6713.cmd)、及びメイク時にそれを行うプロジェクトファイル(Sylphide_Autopilot_ROM.pjt)もあわせて置いておきます。

次にイメージが作成できたらDSK6713に付属していたFlashBurnというユーティリティを使って書き込みました。本来このユーティリティはDSKしか動作しない(その証拠にどのようなボードでも動作する有償のFlashBurn Porting Kitなるものがあります)のですが、Super SylphideはDSK6713とほぼ同じ作りな為なのか、動作してしまいました。もしFlashBurnが動作しなくとも、DSPにFlash ROM書込みアルゴリズムが入ったプログラムを転送後、それをPCのプログラムと対話的に実行するだけでROM書込みは達成されますので、代替プログラムは簡単に作れると思います。
そのFlashBurnですが、残念ながらCE1にFlash ROMが8bitで接続されていることを仮定していました。今回は16bit接続なので、このまま書き込むと容量が半分になってしまいます。また単にCE1の設定レジスタ EMIF_CE1(0x01800004)を16bit幅に対応させれば全領域に書き込めるわけではなく、『TMS320C6000 EMIF to External Flash Memory (spra568)』の『2.3 Byte Addressing and Shifting on the EA Bus』にあるように、C671Xのアドレスバスはバス幅が8bitでない場合、アドレスバスに現れるアドレスが実際アクセスされるアドレスからシフトされるものであるため、正常にFlash ROMの書込みアルゴリズムにはそのシフト分を考慮するプログラムを書く必要がありました。結果、16bit幅に修正したFlashBurnのDSK側プログラムで、正常に動作するようになりました。

最後にROMプログラムが問題なく動いているか、デバックをしました。
このステップでは2つの方法を用いて動作確認をしました。まずブートローダが正常に起動したか確認するため、Code Composer Studio(CCS)のメモリビューワ([View]-[Memory])を用いてROMの内容とRAMの内容を比較しました。その際に参考にするのが、はじめのステップでブートテーブルを作成する際に利用したhex6xが出力するマップファイル(-mapオプションで生成)です。このファイルは

.cinit : btad=90041068 dest=8023c690 size=00001474
のような行を含んでいるので、btad(コピー元アドレス)とdest(コピー先アドレス)の内容を比較します。なおbtadの先頭にはエントリポイント、コピーサイズ、コピー先アドレスが含まれているので最初の数バイトは飛ばしてください。
メモリの内容が一致しているようでしたら、本格的なデバックをします。同じくCCSでシンボルのロード([File]-[Load Symbols]-[Load Symbols Only]で、最初のステップでメイクをした結果生成されたオブジェクトを指定)をした後、実行ボタン([Debug]-[Run])を押してみてしてみてください。正常にプログラムが動いているようなら、ROM化前の、RAMロード後に実行しているのと同じ状態が再現されるはずです。

以上をもってROM化が完了しました。次は航法アルゴリズムのブラッシュアップを行いつつ、誘導・制御に手をだしてみようと思います。なお、アルゴリズムの詳細については以前の記事、『低精度MEMSセンサと汎用GPS受信機の融合による高精度航法システムの研究』をご覧ください。

October 29, 2007 10:13 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

初めまして!
初めてDSPを扱い、参考にさせて頂いてます。

デバイスはC6713を使っており、
カスタムボードですが、EMIF_CE1は同じFLASHROMデバイスの容量が8Mbitのものを(#BYTEを16bitモード)で接続しており、
FlashBurnでも焼いたり、消したりできることは確認できました。
8bitと16bitの合わせ込みでうまくいっていません。
v3.11の無償のFlashBurnのFBTCファイルはカスタマイズできないようになっており、16bitで書込みしているようです。
.Hexを16bitで作り、ユーザープログラムのEMIF_CE1をASYNC16にしたりし、FlashROMブートを試みましたが、起動できませんでした。
かくなる上は.Hexを8bitで作って、間に0x00を埋めていこうかと考えています。
Hex変換のcmdファイルで-order Mをつけるという注意書きがありましたがエンディアンは逆転するのでしょうか?
FlashBurnの設定が固定の状態で、bit幅を合わせこむとしたらどこをいじれば統一できますでしょうか?

Posted by: 岡田 : February 2, 2010 05:49 PM

>岡田さん
fenrirです。
C6713 DSKはROMを8/16bits接続で切り替えができるようになっているのはご存知だと思われますが、それを受けてかDSK版のFBTCでも8bits(こちらは標準付属)の他に16bitsが最近は公開されているようです。
http://www.softwaredesignsolutions.com/flashburn_faq.aspx#FAQ7
にある『DSK6713 16 bit flash support』を使ってみてください。
あと設定にもよる(例えば起動スイッチでエンディアン指定がある)のでしょうが、こちらの環境では-order Mは必要でした。

Posted by: fenrir : February 3, 2010 12:05 AM

コメントする