DMA転送

AC97コーデックのデータの転送量を考えてみましょう。AC97コーデックは1秒間に48000サンプルのデータを取ります。データは1サンプルあたり1フレームのマルチチャンネル構成で伝送されます。1フレームは256ビットからなりますので、これを均等に1スロットあたり16bitで受け取ると、1フレームあたり16スロットとなります。

そうすると1スロットあたりの時間は

1/48000 * 1/16 = 1.3μ秒

160MHzで動作するとき、1.3μ秒は208サイクルです。ところが、VisualDSP++のC言語と標準ライブラリを使って割り込みハンドラを記述すると、一回の割り込みオーバーヘッドは200サイクル程度になり、事実上信号処理をする時間はありません。

割り込みによるオーバーヘッド

そこでこの問題を解決するためにDMA(Direct Memory Access)というハードウェアが設けられています。DMAはIOペリフェラルとメモリーの間で転送を行うためのハードウェアで、決められたアドレスから決められた数のデータをIOのペースにあわせて転送します。この間、プロセッサは他の仕事にかかることができます。DMAは決められた数のデータを転送すると割り込みを起こしてプロセッサに通知します。この割り込みは複数データあたり一回ですので、先のようにデータ転送をすべてソフトウェアで処理する場合に比べると劇的にオーバーヘッドが減ります。

DMAならオーバーヘッドがない

DMAは主要なペリフェラルに一つずつ専用の物が用意されています。例えば、SPORT0からSPORT2まで、それぞれに送信用DMAと受信用DMAが用意されています。

このように便利なDMAですが、いくつか注意する点があります。最初に注意するのは、連続データ転送の場合です。AC97コーデックのように同じIOポートを使って連続的なデータ転送を行う場合、DMA転送が終わってもIOポートは働きつづけています。ということは、すぐに別のDMA転送を動かさないとデータの流れが途絶えてしまいます。一方、直前のDMAで使ったデータバッファはプログラムが何らかの後始末や次の転送の容易をしなければなりませんから、次のDMAでは使えません。結局、連続データの処理はDMA用のバッファを二つ用意して交互に使用することになります。これは注意しないとプログラムが非常に複雑になります(下図)。

二つ目に注意すべき点は遅延です。DMAは受信したデータをプログラムが処理できるようになるまでかなり長い時間がかかります。最大遅延量は一回のDMAで転送するデータの数で決まります。オーバーヘッドを小さくするにはDMAで転送するデータの数を減らしますが、遅延が大きくなります。もし、遅延が問題になる処理ならばDMA転送の数は慎重に決めなければなりません。

⇒次はデスクリプタDMA

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