2.SDカードが遅いのを改めて対策することになろうとは
以前、picocalcのドライバからSDカードのドライバにボーレートが正しく渡ってないのを対策したわけだが、今回は正しく渡されているのに遅いという新現象。
転送速度は、ボーレートを5Mbpsにしても1Mbpsにしてもほとんど変わらず 100kB/s 程度。500kbpsに落としたら50kB/s程度。
これはボーレートが影響するSPI通信以外のところで時間がかかっている。
ということでSDカードのドライバである sdcard.py を読み始めた。
割とシンプルなソースだなぁ。と読み進めていると、SDカードとSPIで通信する前処理でSDカードの応答待ちがありtime.sleep_ms(1) と書いてある。
あ~、こいつか? 1Mbps や 500kbps 設定だとSPIデータの転送の間にSDカードの応答が間に合うが 5Mbps だと間に合わず1msのウエイトが入ってしまうって感じ?
この関数は頻繁に呼ばれるから、1ms待つかもしれないってことになると、そりゃ遅いわ。
試しに sleep_us(20) に変えてみたら性能が改善された。110kB で 1100ms ぐらいだったのが、440ms ぐらいになった。ざっくり三倍。赤く塗っておきたい。
わざわざ sleep_ms を使ってるのは理由がありそうだな。例えばsleep_us が実装されてないマイコンもあるとか。知らんけど。
ともあれ性能もなんとかなりそうだから、ちょっとソースをきれいにしてから先に進もう。




