デスクリプタDMA

DMAの設定について少し考えてみましょう。DMA転送の設定はDSPからプログラムでDMAコントローラーのレジスタを設定することで行います。これはわかります。次に指定された量のDMA転送が終了したとします。どうしましょう。

ちょっと考えるとわかることですが、信号処理の場合わずかな量のデータを処理して終わりということは、まずありません。オーディオデータなら機械のスイッチが切られるまで何時間でもデータは流れ込んできます。それを処理しなければなりません。と、いうことは設定分のDMAが終了しても即座に次のDMAを用意しなければならないということになります。

DMA転送の終了は割り込みを使ってDSPに知らせることができます。それはいいとして、DMA転送の再設定をDSPで行って間に合うものでしょうか。すでに述べたようにデータ転送の中には割り込みでは処理が追いつかないものがあります。DMA転送の再設定をソフトウェアで行っていると、高速なデータは取りこぼしが生じるかもしれません。また、出力の場合はアンダーランがおきるかもしれません。

これを解決するためにADSP-2191のDMAにはチェインニングという機能が備わっています。チェインニングとはDMAハードウェアがソフトウェアの助け無しに自力でメモリー上の転送命令をたどっていく機能です。チェインニングを行うために、ソフトウェアはメモリー上にデスクリプタと呼ばれる構造体を配置します。この構造体は下に書いてあるように全部で5ワードからなるデータで、DMAの機能と転送開始番地、転送ワード数を記述できます。

CFG : DMAの機能を記述する
SRP : DMA開始ページ
SRA : DMA開始アドレス
CNT : DMA転送数
CP  : チェーンポインタ

ここで重要なのは最後のCPワードです。このワードは次のデスクリプタの番地を示すリンクです。DMAハードウェアへの指示はCPでつながるデスクリプタのリンク・リストとしてメモリーに格納され、いったんDMAが開始されるとDMAハードウェアはすべてのデスクリプタの実行が終了するまで次々にデスクリプタのリンクを手繰っていきます。この動作がDMAのチェインニングです。DMAチェインニングは最後にCPに0が書かれたデスクリプタがロードされるまで実行が続きます。デスクリプタをたどるのはDMAハードウェアですから、DSPの割り込みハンドラがDMAを再設定するよりはるかに高速にDMAの再設定を行えます。CPが0であるデスクリプタはDMAハードウェアから無視されます。この結果、一回しか転送しないDMAであってもデスクリプタが2つ必要なことに注意してください。

最後に、DMAのデスクリプタをC言語で記述すると以下のようになります。

struct TDMADescriptor 
{
        int configuration, startPage, startAddress, count;
        struct TDMADescriptor * nextDescriptor;
};

⇒次は実際のプログラム

2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |