スポンサーサイト

.-- -- スポンサー広告 comment(-) trackback(-)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AVRライタ高速化(5)

.19 2010 AVR-USB comment(0) trackback(0)
Tiny2313のSRAM size = 128 byte。
バッファサイズを大きくして作ったコードをコンパイル。elfについてavr-sizeコマンドで使用容量を調べるとSRAMは121byte。
一見するとギリギリセーフに見えます。
が、実際に書き込んでみると、見事にUSBの通信ができなくなってしまいました。

よーく考えるとavr-sizeで表示された数字はstaticに確保されたSRAM領域の容量なのでスタックの分は含まれていないっぽいですね。
実際、USB通信のときに8byte以上pushしているのでここでSRAMの変な領域を書き潰していると思われます。
また、push pop 以外にもrcallなどでスタック使うのでその分も考えないといけないわけです。
今回は見事にpushで戻りアドレスの値を書き潰してしまったような現象が確認できました。
(通常のデータ領域が書き潰されてもUSBの通信そのものがイカれるはずはないので)

---

とりあえず現状でattiny2313(2kB)の書き込みにかかる時間を計測してみました。
明示的にSleep(1)(勿論timeBeginPeriod(1)で精度を上げて使っている)をはさんで16byteずつ送信した場合、1.5sec程度。
32byteずつ、whileでUusbd_VendorRequestが成功するまで送り続けるモードでは1.2sec程度。

正確には計測していませんが、Tiny2313の場合、Erase Write Verifyの合計時間は約2secと思われます。

1ms waitではかなりSPIバスがスカスカになるのですが、これとwhileで回した場合の時間が殆ど同じということは、同じデータが再送された回数がかなり多いということになります。

純正品は4kBのデバイスに対してErase, Write, Verifyを含めて1.5secのようです。
現段階では純正品の1/3の速度しか出ていないわけでまだまだ高速化の余地ありということですね。

まずは受信バッファを32byteにして高速化します…

といいたいところですが、この際全部まとめてアセンブリに落として高速化するのが一番手っ取り早い気がしてきました。
そうすれば受信バッファも64byteまであげられる可能性もあるわけで。

# note: 即値系の命令はr16 - r31に対してのみ有効

関連記事

  • comment
  • secret
  • 管理者にだけ表示を許可する

trackbackURL:http://yuranos.blog11.fc2.com/tb.php/82-86899c46
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。