リングバッファとDMAの連携
ちょっと時系列を遡って申し訳ないのですが、
図形描画の時になぜリングバッファを使っていたのかという質問を頂いたので
答えたいと思います。
一言でいうと「DMAを使ってCPUをなるべく自由にさせたい」という理由からです。
逆説的にDMAを使わない場合のデメリットを述べて、DMAを使った理由を説明します。
DMAを使わない場合の図形描画は主に2通りの方法があると思います。
1.液晶のメインクロックによる割込み処理にてCPU処理する。
2.ポーリングして、割り込みフラグを常に監視して、フラグが立てばすぐに出力、
そして次のフラグまでに次のデータを用意する。
1.のやり方をやると最低でも割込み遅延8クロックのおかげで10クロック程度は掛かると思います。
昔はDMA転送がもっと早いと思っていたので、候補に挙げませんでした。(実際はほぼ同等の速度)
2.のやり方はポーリング待ちの時間を除けばCPU負荷が1.よりも軽く、現実性があります。
ただし、別のCPU処理、もしくは割込みが入るとリアルタイム性が維持できない(ビット欠けする)
可能性が出てきます。うまく時間管理をしてあげれば可能かもしれませんが・・・
上記2つのやり方と比較してDMAは以下の利点があります。
①転送にはCPUを使わない為、(他のDMAチャンネルを使わない限り)リアルタイム性が保障される。
DMAの転送速度は液晶のクロックに間に合えば、それ以上早い速度であるメリットは全く無い。
さらに、CPUが行える処理が増える。
②バッファメモリを使えば、ワークメモリから2倍する処理を14行ごとという単位にブロック化できる。
ピクセルの処理時間がばらついてもブロック単位の時間内に収まれば、ちゃんと表示できる。
逆にDMAのデメリットとしては
1.意外に遅い。9~10クロック程度。また、他のDMAチャネルを利用すると
競合してやたら速度が落ちるので、使いどころは慎重に。
2.バッファメモリはSRAMを圧迫する。STBeeはSRAMが64kBと大きかった為採用した。
しかし、図形描画の実現そのものに関してはDMAが無くても出来るため、
余りメリットの無かったリングバッファですが
動画再生についていうと必須であると感じています。
その理由は2つありまして
1つ目はSRAMが1画面分のデータを蓄えられないので小分けにするしかない事です。
2つ目はSDカードから転送されたデータを有る程度以上、
バッファメモリにて一時保管しなければ速度が異常に落ちるからです。
512バイト読み出し時の速度は1.5MB/sec
16kB読み出し時の速度は7.4MB/secと 5倍程度の開きがあります。
(インターフェイス2009年6月号より)
どうやら、読み出しコマンドからデータ転送までの間に長い無反応時間があるようで
その無反応時間は読み出すセクタ数に関係しない為、少量の読み出しで速度が落ちるようです。
私の目標の400*16*2*60 = 4.608MB/secの転送速度をたたき出す為には
バッファメモリは必須なのです。
リングバッファと言っても実際はただの配列なのですが
DMAに繰り返し読ませ、読んでない部分を書き込む事で
結果的にリングバッファという使い方になります。