«前の日記(2010-02-05) 最新 次の日記(2010-02-09)» 編集

ぱぱネット(仮)


2010-02-08 EZ-USBで遊ぼう(?) [長年日記]

_ [開発][Linux] USBのスループット

趣味なのでしばらく放ってあったのだが、EZ-USBの進捗を書いてなかった。 だれも聞いてないって?そりゃそうか(^^;;組み込み系に全く興味のない人には 役立たないのは許してくれ。

ちょっと思い立ってバルク転送の速度を計測するファームウェアをかいた。

do {
  if ((EP6CS & bmBIT2)) {
    EP6FIFOBUF[0] = lpcnt;
    lpcnt++;
    if (ms_counter < 127) ++ms_counter;
    EP6BCH = BLOCKSIZE >> 8;
    EP6BCL = BLOCKSIZE & 0xff;
    SYNCDELAY;
  }
} while (ms_counter > 0);

EP6にホストから何らかリクエスト(今回はread)があると、 問答無用でFIFOポインタを最大にセットを繰り返す。つまり ホストが読みたい分だけ読めるというわけ。読み出しの単位はあくまでエンドポイント6の 設定による。USB2.0で512byte x 2(ダブルバッファ)に設定しているので、 このループ内のif文は 512バイト1パケット で処理される。lpcntをセット しているのは先頭の1バイトをインクリメンタルカウンタにするため。 本来はデータ全部をチェックするように規則データを埋め込むべきなんだろうが EZ-USBの8051にデータ舐める処理やらせると死ぬほど遅い ため 手抜きチェックとなっている。

終了処理はタイムアウトで行う。最初スタートとストップのコマンドをバルク転送で... とやっていたのだが、同じエンドポイントをコマンドとデータで共有するとエラーが 起きたときに困ったことになる。もちろんEP0,1あたりでコマンドをやりとりする ルーチンを書くのが正道なのだが... EZ-USBにはソフトタイマーがある ので今回はこれを使うことにした。オプティマイズさんのコード丸写しだけども。

unsigned char ms_counter;

void timer0() interrupt 1  //register BANK1
{
  if(ms_counter > 0) --ms_counter;
  TL0 = LSB(0x10000-12000000/1000);
  TH0 = MSB(0x10000-12000000/1000);
}

void timer_init()
{
  TMOD = 0x01;  //GATE0:0 CT0:0 M1M0:01
  CKCON = (CKCON&(~0x08)) | 0x08; //T0M:1(48MHz/4=12MHz)

  ms_counter = 0;
  TR0 = 1;              //enable timer0
  ET0 = 1;              //timer0 irq enable
}

これで約1msごとにグローバルのms_counter変数がカウントダウンされる。 先ほどのバルク転送ルーチンではms_counterが127未満のときは 転送が起きるごとに+1するようになっている。 つまり、127msの間に1回も転送がおきないとタイムアウトしてルーチンを抜ける というわけ。

_ [開発][Linux] ホスト側

LinuxなのでCypress標準のCyAPIは使わず(使えず)、libusbを使うことにする。 バルクリードの典型コードはこんなかんじ。

result = usb_bulk_read(dh, _EP6IN, readbuf, chunksize, _USBTIMEOUT);

ここでchunksizeは前記USB2.0の パケットサイズでなくともよい 。 どうもlibusb(かuser-land USB driver)が物理的なパケットサイズに 分割してくれるようだ。むしろ512バイトなどと設定するとバッファリングが効かずに 性能低下してしまう。ここでは4096バイトを採用することにした。

_ [開発][Linux] ベンチマーク

1台め。いずれもEZ-USBはマザボUSB直結。

  • Athlon64X2 4400+(2.2GHz)
  • ASUS M2A-VM HDMI(AMD780Gチップセット)
  • Linux-2.6.29(libusb-0.1)
SPAN: 561.46 sec.
TOTAL: 4194304000 bytes.
Throughput: 59.806816 Mbps

2台め。ちょっと古い。

  • Pentium4/1.6GHz
  • Gigabyte GA-8PE667(i845チップセット)
  • Linux-2.6.29(libusb-0.1)
SPAN: 266.933 sec.
TOTAL: 4194304000 bytes.
Throughput: 125.703421 Mbps

P4のほうが速いとかもうね...

疑ってチャンクサイズを変更したり試行錯誤したんだが、この傾向は変わらなかった (512未満だと両者とも30Mbpsを切って差がなくなるけど)。あ、どっちもインクリメンタルカウンタ レベルではデータ化けとかパケット欠落はなかったです。

スループットは、いろいろな条件が作用するので一概には言えないけど、 こんなプリミティブな部分で差がつくとはおもわなかった。 USBホストデバイスの出来不出来で案外性能差が出るのかもしれん、という話。 腐ってもIntelなのか??


2001|04|
2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|05|10|

[BANNER]
このサーバーをもう12年も維持しているかと思うとめまいがしますよ。
ツッコミ機能は、ハンドル名が完全日本語じゃないと登録できません。
また、本文にURLが含まれていても登録できません。
いずれもSPAM対策です。
[Panda Papanda]
2010年
2月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

[Papanda]  [Kuma]  [Tomorin]  [Iron]  [Eiza]  [Dokkin]  [Honya]  [Zyou]  [Tsuyo]  [Bike]  [KoeBBS]  [Chukei]  [portal]  [tvmatome]  [KaoPaku] 

訪問者数:(+2560143)