Lattice XP2のUSB-JTAG書き込み(続)
トラ技78K基板を使ったLattice XP2のUSB-JTAG書き込みプログラムの開発を行っています。
前回のボトルネックは、PC→78K側への転送速度でした。トラ技2008年8月号153ページに書いてあるように、trg_recvdata関数を使ったのでは毎秒5kバイトの速度しか出ません。そこで、153ページ右側にあるルーチンに相当するものをRAM上に作ったところ、たしかに速度は向上し、約2倍にはなりました。
78Kマイコンは、プログラムを拡張RAM上で動かすよりもROM上で動かしたほうが若干早いのでしょうか。データシートの命令サイクルにはROM上での値です、と書いてありますし。
そういうわけで、78K-USB-JTAGはROMプログラムにすることにして、さらに、USBファームウェアの中のルーチンを直接コールしたり、USBのパケットを調べる処理の発行タイミングを最適化したりして、ブロック読み出し関数を作リ直してみたところ、PC→78K方向への転送速度は毎秒42kバイトにまで向上しました。
これは、ざっと8倍の速さです。たぶん、Cで書いている限りこれが限界でしょう。高速化Readルーチンはいずれ公開するとして、今はUSB-JTAGの開発を進めることにします。
いろいろプログラムを改良していたら、LFXP2-17Eでは、書き込みとベリファイをあわせて6分程度でできるようになりました。前の状態から比べるとだいたい2倍速くなりました。DDTの付録のLFXP2-5Eならば、書き込み・ベリファイ合わせて2分程度でできるでしょう。
LFXP2-17Eを、MITOUJTAGでバウンダリスキャンしてみると、毎秒22回でした。
できれば、もっと速くしたい。
USBの転送とかは最適化したはずなので、現在のボトルネックはJTAG信号を作り出すC言語のルーチンにあります。78KのCコンパイラは、よくあるCコンパイラと同様にローカル変数をどんどんスタックに入れていきます。78Kのアーキテクチャにとっては、これは重そう・・
JTAG信号の送受信ルーチンを、手作業で徹底的に最適化されたアセンブラで書けば、いまよりずっと速くなるとは思うのですが、さて、どうなることやら。
| 固定リンク
コメント
C言語のルーチンをアセンブラにしたら、LFXP2-17Eの書き込みに3分かかっていたのが1分20秒にまで縮まりました。まだまだ最適化できそうです。
目標は、
・LFXP2-17Eの書き込み・ベリファイ合わせて1分半
・LFXP2-5Eの書き込み・ベリファイ合わせて30秒
です
投稿: なひたふ | 2009.04.03 10:38