バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのSDモード通信の(Multiple) Block Write Operationについて。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
SDモード通信の(Multiple) Block Write Operation
今回は、SDモードの(Multiple) Block Write Operation。
- No data Operation
- (Multiple) Block Read Operation
- (Multiple) Block Write Operation ← これ
前回がReadで、今回がWriteか。
基本的な構成は一緒になるのかな?
うん。
大体似てるよ。
ただ、書き込み処理と言うことでところどころbusyが挟まってHost側は送信速度を調整してあげる必要はあるね。
busy
なるほど。
確かに、SDカード内部のNAND-Flashへバッファリングしながら書いてるだろうから、SDカード側の都合に合わせてあげる必要はありそうだね。
このbusy時間はSDカードによって結構変わること多し、
同じSDカードでもタイミングによって変わることもある。
そうなの?
さっき、太郎くんも言ってたけど、NAND-FlashROMがランダムアクセスし難いんで、
そこら辺の調整と、ウェアレベリングによる利用Blockの調整が入るんで、
重い処理が重なるとどうしても時間がかかることになる。
busy時間
ところで、busyは最大どの程度待てばよいとかあるの?
具体的にこれって数値はないのだけど、
ACMD13(SD_STATUS)でSD statusってのがとれて、
その中にAU_SIZEってパラメータが取得できる。
AU_SIZEの定義は以下。
AU_SIZE | Value |
---|---|
0h | – |
1h | 16[Kbyte] |
2h | 32[Kbyte] |
3h | 64[Kbyte] |
4h | 128[Kbyte] |
5h | 256[Kbyte] |
6h | 512[Kbyte] |
7h | 1[Mbyte] |
8h | 2[Mbyte] |
9h | 4[Mbyte] |
Ah | 8[Mbyte] |
Bh | 12[Mbyte] |
Ch | 16[Mbyte] |
Dh | 24[Mbyte] |
Eh | 32[Mbyte] |
Fh | 64[Mbyte] |
ほー。いろんなサイズがあるんだ。
これが恐らく、NAND-FlashROMの消去単位になるんだと思う。
これと時間がどう関係するの?
SDカード仕様上では、AU_SIZE1個の消去時間が1秒。
って定義されてる。
例えば、AU_SIZEが5=256[Kbyte]の場合、
512[Kbyte]の書き込みは2秒を想定する。
ちなみに256[Kbyte]未満の書き込みでも1秒は待つ必要はある。
あー、SDカードが持ってるNAND-FlashROM性質に依存するから、その性質に強く起因するAU_SIZEを取得できるようにしてる。
ってわけか。
そういうことだね。
AU_SIZEについてあれこれ
大体AU_SIZEっていくつぐらいが主流なのかな?
うーん、その時々のNAND-FlashROMの製造技術に依存するんで一概には言えないけど、
大体。128[KByte]~4[Mbyte]ってところかなー。
むちゃむちゃ広いじゃん!!
AU_SIZEが大きいほど集積度を引き上げやすいし低価格化し易いから、
こればっかりは、具体的にコレってのは出せないな。
逆に目的に合わせて適切なAU_SZIEを持ったSDカードを選定するって考え方も必要かもね。
というと?
組み込みシステムだと読み書き速度が重要なんでAU_SIZEが小さい方が有利になる。
しかし、一回に書き込むサイズが明らかに1[Mbyte]を超えるのであれば、集積度重視で1[Mbyte]を選定するのも良い。
あとはAU_SIZEを見た上で書き込み単位をそれに切り揃えると、SDカードとしての最大のパフォーマンスを引き出せる。
とか。
ほー。
PCでSD使うときだと全然意識しない話だなー。
組み込みならではの話だねー。
まとめ
まとめだよ。
- SDモード通信の(Multiple) Block Write Operationについて説明。
- data block送信毎にbusyが入る。
- busyの待ち時間はACMD13(SD_STATUS)で取得できるAU_SIZEに依存。
- AU_SIZEは組み込みに於いては重要なパラメータ。
- AU_SIZEが小さい高速なSDカードを選択したり、AU_SIZEに合わせて書き込み単位を変えたり。
バックナンバーはこちら。
コメント