修理に出していた自転車がようやく直った。実は先々週に近所のホームセンターに出していたのだが、 「9段ギアを1枚抜いて8段にしていたのでチェーン再発注しますね」 とやんわり怒られて1週間延びた(笑)。これ、バイクの人から譲ってもらったものなのだが、そういう重要な情報はウチに来たときに言っておいてホシス・・・
ともかく外は快晴。30kmほど走ってきたが、もっぱら使っていたママチャリより漕ぎ出しが軽くて驚く。 「こんな軽かったっけ?」 というくらいに・・・MTBのフレームにロード用のスリックタイヤ履いている変則構成だけども。
ママチャリの方を電動自転車にしようと思っていたのだが悩んでしまうな。↑のMTBだと 2,3漕ぎで20km/h超えてしまう。 自重の軽さを活かして坂道昇りでも加速することができる。
電動自転車はあくまでアシストで、20km/h超えると切れちゃうんだよね・・・?それって街中の信号待ちなどのストップ&ゴー以外にはほとんど意味ないってことになっちゃわないだろうか。
B001C6XATE
今日寄ってきたイオン内の自転車屋で、エナクル8という旧機種が89800円だった。航続距離は短いものの8段変速で良いと思ったのだが、↑の推測が正しいとするとほとんど20km/h超えてしまうから無意味なんだろうかねえ。むしろ重い分不利なのではないかと。
趣味なのでしばらく放ってあったのだが、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なのでCypress標準のCyAPIは使わず(使えず)、libusbを使うことにする。 バルクリードの典型コードはこんなかんじ。
result = usb_bulk_read(dh, _EP6IN, readbuf, chunksize, _USBTIMEOUT);
ここでchunksizeは前記USB2.0の パケットサイズでなくともよい 。 どうもlibusb(かuser-land USB driver)が物理的なパケットサイズに 分割してくれるようだ。むしろ512バイトなどと設定するとバッファリングが効かずに 性能低下してしまう。ここでは4096バイトを採用することにした。
1台め。いずれもEZ-USBはマザボUSB直結。
SPAN: 561.46 sec. TOTAL: 4194304000 bytes. Throughput: 59.806816 Mbps
2台め。ちょっと古い。
SPAN: 266.933 sec. TOTAL: 4194304000 bytes. Throughput: 125.703421 Mbps
疑ってチャンクサイズを変更したり試行錯誤したんだが、この傾向は変わらなかった (512未満だと両者とも30Mbpsを切って差がなくなるけど)。あ、どっちもインクリメンタルカウンタ レベルではデータ化けとかパケット欠落はなかったです。
スループットは、いろいろな条件が作用するので一概には言えないけど、 こんなプリミティブな部分で差がつくとはおもわなかった。 USBホストデバイスの出来不出来で案外性能差が出るのかもしれん、という話。 腐ってもIntelなのか??
_ toga [今乗ってる自転車の仕様が「クロスバイク」っていうんだよ。電動自転車要らないっしょ?]
_ ぱ [電チャリの値段で、通勤仕様クロスバイク(完全泥除けオートライト)を組んでもらうという手もあるな。 あとエナクル8は..]