長所と短所は、DMAはCPUがネイティブ速度で効果的に動作できるのに対して、周辺機器はネイティブ速度で効果的に動作できることです。例のほとんどの数字は構成されています。
ADCから定期的にデータを収集する2つのオプションを比較してみましょう。
- 割り込みの一部としてADCを設定できます(定期的またはその他)
- バッファを作成し、DMAにADCの読み取り値をバッファに転送するように指示できます。
ADCからRAMに1000個のサンプルを転送してみましょう。
オプション1の使用:すべてのサンプルについて
- 12サイクルが割り込みの入力に費やされます
- adc(s)を読み取ります
- ラムに保管
- 割り込みの終了に12サイクルが費やされます
この割り込み関数が76命令であるとします。1サイクルの実行(ベストケース)を想定して、ルーチン全体の長さは100命令です。つまり、オプション1は100,000サイクルのCPU時間の実行に費やされます。
オプション2:DMAを構成して、ADCの1000サンプルを収集します。ADCにタイマーカウンターからのハードウェアトリガーがあると仮定します。
- ADCおよびDMAは1000サンプルのデータをRAMに転送します
- DMAは1000サンプル後にCPUを中断します
- 12サイクルが割り込みの入力に費やされます
- コードが発生します(DMAにRAMを上書きするように伝えます)
- 割り込みの終了に12サイクルが費やされます
割り込み全体のふりをする(入り口と出口のオーバーヘッドを伴う)は、100シングルサイクル命令です。DMAを使用すると、同じ1000サンプルを保存するのに100サイクルしかかかりません。
現在、DMAがバスにアクセスするたびに、はい、CPUとDMAの間に論争があるかもしれません。CPUは、DMAが終了するのを待たされることさえあります。しかし、DMAの終了を待つことは、CPUをロックしてADCを処理するよりもはるかに短いです。CPUコアクロックが2xバスクロックである場合、CPUはDMAが終了するまで数コアサイクルを浪費する可能性があります。つまり、転送の有効な実行時間は1000(CPUは待機しないと仮定)から9000サイクルの間です。それでも100,000サイクルよりはるかに優れています。