スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SDカード・トランスポータの作成(その15)

FatFsの共有セクタ・バッファの使用され状況を調べてみました。ソースコードは既に解析済みですが…念の為。

以前(その13)も書いたように今回の使用は Read Only で、1024byte(2セクタサイズ)の書き込み領域を用意してファイルの先頭から読み込む。ファイルの終端まで前回の続きから読み込む。なので、1セクタに満たない読み込みはファイルの最後の部分のみになります。

1024byteのファイルを用意して1024byteのバッファへ読み込んだ場合、共有セクタ・バッファを使用した形跡がありませんでした。続けて768byteのファイルを用意して1024byteのバッファへ読み込んだ場合、共有セクタ・バッファが256byte使用されていました。続けて512byteのファイルを用意して1024byteのバッファへ読み込んだ場合、共有セクタ・バッファを使用した形跡がありませんでした。更に256byteのファイルを用意して1024byteのバッファへ読み込んだ場合、共有セクタ・バッファが256byte使用されていました。

やはり、セクタの先頭から読み込んだ場合でも残りのファイルサイズがセクタサイズ(512byte)に満たない場合は共有セクタ・バッファに一端 1セクタ分読み込んで実サイズ分だけ指定先のバッファへ書き写している様です。

FatFs R0.07a では1セクタに満たない領域、または1セクタの途中から始まる領域データの取得は連続読み込みシーケンスの外にあります。なので、これらの条件分の前に1セクタに満たない領域であってもセクタ単位で読み込む様に容量を調整して最後に f_read() の第4引数の内容を変更して帳尻を合わせるようにしました。これに伴い、FIL構造体の buf[] メンバが必要ないので削除……f_lseek()で使っているので削除自体は出来ませんでした。が、配列サイズを '1' にしました。f_lseek()は使わないので削除しても良かったのですが、なるべく変更箇所を限定したかったので削除しませんでした。

sdc_fatfs_remodel

前記した使用条件が前提の変更なので、f_lseek() を使ってファイル(セクタ)の途中から読み込んだり、書き込み先のバッファがセクタ単位でなかったり、Read Only でない場合のケアはしていません。

これらの修正をする事により以下の処理改善が望めます。

 1. ファイル終端での余分なメモリ間コピーが無くなる
 2. システムが利用するバッファを511byte減らせる

2は大きな収穫です。4KByteのメモリでデータを3重にバッファリングするために1バッファ当たり1KByte割り当てる事が出来るようになりました。

1の方は2を実現する過程で付随してきた嬉しい誤算です。ファイルの終端近辺の処理では、次のファイルを検索したり、準備したりの処理が入るのでなるべく軽い方が今後の設計が楽です。

作成したファイルは以下になります。

sdc_ff_remodel_02.zip

スポンサーサイト

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
05 | 2017/06 | 07
- - - - 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 29 30 -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。