割り込みとDMAについて考え直してみた

たきすと!さんのつぶやきに触発されてDMAと割り込みについて考え直してみました。

割り込みによる転送はデータを1つ転送する度にCPUに割り込みが掛かります。割り込みの都度、CPUはコンテキストを保存し、割り込み処理後にコンテキストを復帰します。一般に割り込みによる転送では、実際の割り込み処理(データ転送)は軽微ですが、その都度発生するコンテキストの保存と復帰が大きな負担になると考えられます。

DMAによる転送では、あらかじめ指定したN個のデータ転送が終わるとCPUに割り込みがかかります。そのため、コンテキストの保存・復帰オーバーヘッドは、割り込みによる転送の1/Nになります。

ですから、「割り込みは効率が悪く、DMAを使うべし」という錦の御旗が掲げられていました。私も掲げていました。しかしながら、この錦の御旗は随分古くから有りますので、CPUが安くて高速になった今でも必要なのかはきちんと考え直す必要があります。

ざっくりと、CORTEX-M4の割り込みオーバーヘッドを保存と復帰あわせて200サイクルと見積もりましょう。一方データ転送レートをFs=48kHzと仮定します。この場合1ステレオ・データあたり1回の割り込みが入ります。LPC4088の動作周波数を100MHzとすると1割り込みあたりのCPUサイクルは2000です。

「10%も食うのか!」

と言う人もいらっしゃると思いますが、私の視点だと

「あほらしくて最適化する気にもならない」

です。だって、これを必死に半分にしても演算に使える時間は5%しか伸びないのですよ。

そういうわけで、LPC4088でオーディオ信号を転送するだけでしたら、DMAを使う必要はなさそうです。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください