« 曲の選択 | トップページ | オカマバー »

2016年1月 7日 (木)

プリフェッチキュー

外付けEEPROMの読み出しが遅いため、演奏が乱れる曲がある。
EEPROMの内容を内蔵EEPEOMにロードするとかなり改善されるが、ロードに時間がかかる。1曲4KBで12sec待ちは厳しい。
ただしロードしてから演奏する方法をとるなら、zip圧縮された曲データを、解凍しながらロードすることも可能だ。
曲データは約1/3に圧縮できるから、現在の3倍もの曲を記憶できる。(※1)
圧縮データを読むので、内蔵EEPROMからの読み出しが高速化されるが、
展開したデータを書き込む処理がとても遅いため、ロード時間の短縮にはならない。

それからもう一つ。データシートによると、EEPROMは10,000回程度の書き込みに耐えるとなっている。
言い換えると10,000回書き込むと、壊れるかもしれないということだ。
たとえばloop()が100回/秒で回っていて、その中にEEPROMへの書き込み処理があれば、たった100秒で壊れてしまう可能性がある。
曲の切り替えボタンでロードという使い方だと、毎日100曲切り替えても100日は持つ。マリオのジャンプ音みたいな音楽だったら何百回も演奏される可能性がある。
前回と同じ曲を演奏するなら、再ロードしないという工夫は欲しい。

とはいうものの、EEPROMへのロード時間が不満なら、この方法は使えない。
曲データは基本的にシーケンシャルだから、次に使いそうなデータをRAMに先読みしておくのはどうだろう。
こういった仕組みをプリフェッチキューという。
この先読み処理のために、音楽のテンポが遅くなっては意味がない。
タイマの値を調べ、余裕がある時に先読みすればいい。
計測したところ、外付けEEPROM(24xx512使用)からの読み込みには、16bytesには660us、32bytesには1160usかかることがわかった。
この時間はそこそこ正確で、10回中9回はこの値。ずれてもせいぜい+2usだった。
読み込んだデータはI2Cのバッファサイズに合わせて32bytes、読み書きがもっとも速いRAMに置くことになる。
プリフェッチキューを試したところ、全体的に軽くなったが、処理落ちには何の効果もなかった。私の休日を返せ。

※1. zip圧縮された曲データを解凍しながらロードすることも考えた。
それはいかにも楽しそうな作業だが、大容量のEEPROM、たとえば24LC1025は350円で買える。
たとえ数時間で開発できたとしても時給100円。それは金で解決すべき問題だと思う。

« 曲の選択 | トップページ | オカマバー »

お仕事」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/24707/63394504

この記事へのトラックバック一覧です: プリフェッチキュー:

« 曲の選択 | トップページ | オカマバー »

最近のトラックバック