チカラの技術

電子工作やプログラミング

でかい壁にぶち当たりました。

60fpが出ません。
現在50fpsがまともに出る最高速度です。
このままでは終わらせねぇ!! 
 
ボトルネックになっている遅延症状
100msec~1500msecの間のランダムなタイミングで
3割程の転送遅延が起きて、リングバッファへの書き込みが間に合いません。
結果、画面が思いっきりズレて見れたものじゃないです。
 
○原因
デバッグの結果、FAT領域読み込みによる遅延だと判明しました。
 
FATFSはクラスタ境界において、FAT領域にデータを読み込みに行く事があります。
クラスタをまたいでも毎回FAT領域を読みに行くわけではない。
 FATFSにはDisk access windowというアクセス単位があって、それをまたぐ時にFATを読みに行く模様
前回説明したように、SDカードは少量の読み出しでも一定の無反応時間があります。
よって読み出すデータサイズが同じでも、FAT領域を読みに行った時は転送時間が長くなります。
※これはFATファイルシステムそのものに起因する遅延で、FATFSだから起こるという訳では有りません。 
 むしろFATFSはFAT読込を減らす工夫がされています。
 
○対策検討
色々考えましたが、現状のままちょっとプログラムを工夫して解決というレベルの問題では無いようです。
なぜなら
● FATシステムにおいてFAT領域へのアクセスは必須である。
  とはいえ動画再生中にアクセスが必要になった時にSDカードから読み出せば、
  遅延が起きて動画情報を取りこぼす。
  つまり、あらかじめSDカード以上の速度で読み出せるメディア(SRAMかROM)にFAT領域を保存しておき
  読み込まなければ、動画の何処かで必ず取りこぼしを起こす。
  しかしFATFSの改造が必要な上に、
  2GBのSDカードのFAT領域は128kBある(最下段に計算過程を記載)為、実装も容易ではない。
という事から、「工夫」から「改造」へと方向性を変えなければ解決できません。
 
ここで、「たら、れば」の話をするのは良くないのですが、内臓SRAMの容量が今の倍程あれば、
リングバッファのサイズをもっと大きくして、FAT領域読込時の遅延を動画データの読込の後の余った
時間を使って吸収できたかもしれません。
 
ついに、SDカードとSTM32の限界を見た気がします。
 
○対策案
 もはや、いずれの方法をとっても汎用性ゼロの誰にもオススメできない方法になってしまいますが
 致し方ありません。60fpsを達成しなければ私は口だけ野郎で終わってしまいます。
 
①FATファイルシステム及びFATFSを無視してクラスタチェーンがファイルの最後まで連続だとして読み出す。
②ROMにFAT領域を無圧縮でそこそこ書き込んでFATFSを改造して読み出す。
③FAT領域を圧縮してSRAMかROMに収めて、FATFSを改造して読み出す。
 
①はニコニコ技術部の「撮影できますP」さんが使っていた方法です。
 フォーマットされたSDカードに書き込めば、クラスタが全て連続しているのか
 特別な方法で書き込む必要があるのか分かりませんが、最も簡易で現実的な方法かと思われます。
 とはいえ、読み出しアルゴリズムを自分で作る必要はありそうですね・・・
 
②はSDカードのデータ領域1.5GB分のFAT領域(85kB位)位を、動画再生前に
 読み出してROMに収めて、再生時はそこからFAT領域を読み出すようにFATFSを改造する作戦。
 ROMに収める時にやたら時間が掛かりそうなのと、FATFSの改造が難儀な点がネック。
 
③はクラスタチェーンがほとんど連続している事を利用して、連続したクラスタチェーンは、連続した回数のみを
 数えて、数値として表せばFAT領域を大幅に圧縮できる。
 あとは②と一緒。これならSRAMにでも収まりそう。
 例 クラスタチェーンが1,2,3,4,5,6,7,8,9,15,16なら連続数の前に00を入れて識別して
    01,00,09,15,00,02というように表す。連続している分だけ圧縮できる。
 圧縮アルゴリズムと解凍アルゴリズムを作ってFATFSに実装するのが大変。
 ていうか俺の頭ではかなりの難易度であろう。
 
神は言っている・・・「そろそろ一旦、まとめておけ」・・・と。
 
そうですねー。
解決案を実行する前に現状の動画再生方法をまとめておいて、後戻りできるようにします。
次回はそんな感じでいきます。

 
●ボツの対策案は以下
×外部SRAMを搭載して、リングバッファを大きくする 
 SDカードから外部SRAM,リングバッファ,LCDと転送していたら60fpsの速度に間に合わない。
 
×SDHCを導入する
 FAT領域などの小容量読み出し時の読み出し速度はSDカードと余り変わらないらしい。
 
×USBメモリカードを導入
 USBのホスト機能がついて無いっス
 
 

●FAT領域の計算
ファイルサイズが2GBとしてSDカードのクラスタサイズは32kBだからクラスタ情報の数は
2147483648 ÷ 32768 = 65536個
FAT16における1つのクラスタ情報は16bit=2byteなので
FAT領域のサイズは
65536 × 2 ÷ 1024 = 128kB