02

12

コメント

DMAあれこれ

■ DMA vs memcpy (SH2 with HEW)

C言語においてメモリ内容をコピーする場合、memcpyを使用するのが一般的。

DMAコントローラーを制御できる場合はDMAでコピーするのも手。
DMAとはDirectMemoryAccessの略で、CPUを介すことなくメモリに直接アクセスして、コピー等を行うことで、
DMACとはDirectMemoryAccessControllerの略でDMAを実行するのハードウェアのこと。
組込用途だと、最近は外付けのDMAコントローラーなんて使わなくて、チップに内蔵しているものを使います。


DMAに転送する元番地、先番地、回数、ビット幅、番地をカウントアップするかどうか等の設定をするとハードウェアが勝手に転送してくれます。
その間CPUは他の処理が出来るというわけです。
といってもDMA実行中はバスマスターがDMAとなり、CPUはメモリアクセスできないのでできることは限られてきますが。

DMAとmemcpy()関数とどちらが速いかということですが、今まで私は圧倒的にDMAが速いと思っていました。
事実そういうことが多いのですが、あるとき、こんなことがありました。
ルネサスSH2で HEWコンパイラのときに少しでも転送時間を短くしたいことがあり、memcpyをやめてDMAでメモリ転送を使ったのですが、どうも早くなっていません。
おかしいと思い、memcpyとDMAで実行時間を比較しましたところ、ほとんど同じという結果が出ました。

恐るべしHEWコンパイラ。

普通考えればハードウェアで実行している処理とソフトウェアで実行している処理と同じというのはちょっと考えられません。
というのもソフトウェアで処理する場合(memcpyの場合)、データをコピーする時間に加えて、回数を計算する処理が必要だからです。

memcpyのライブラリがどのようになっているかは知りませんが、おそらくマシン語でカリカリにチューニングしてあるのでしょう。


■DMAのmemcpy的ではない使い方

で、SH2始めとする多くの組込MPUはDMAはmemcpyの代わりだけに使うのではなくて、例えばシリアルなどの割り込みと連動して使用できます。
元番地をSIOの受信データレジスタ
先番地を受信バッファのアドレス、
DMAのトリガをSIOの受信割り込みと絡ませてやるわけです。

こうすることによって割り込み処理を使わなくても取りこぼしがない受信ができます。
当然送信もできるし、タイマの割り込みフラグと絡ませると時間キッチリでDAにデータを連続出力して、アナログ波形を出すなどという芸当も出来ます。

割り込みのオーバーヘッド(つまり、レジスタ退避などの時間)がないので、割り込み処理を使うよりも高速に処理できます。
しかもデータの取り込みにCPUのパワーを使わないところもイイデスネ。


■DMA サイクルスチールモードとバーストモード

DMAの転送にはサイクルスチールモードとバーストモード二つのモードがあります。
サイクルスチールはCPUとDMACがバス権を渡しあって処理をします。
CPUが1回データを動かしたらDMACにバス権を渡し、
DMAが1回転送をしたらCPUにバス権を渡します。

バーストは設定した転送回数が終了するまでバス権を渡しません。

当然バーストの方が転送時間が短いのですが、転送終了までバス権が渡されないので、割り込みも転送終了まで待つことになります。
転送速度の要求でやむないときもありますが、転送時間がどの程度になるかキッチリ計算・測定する必要があります。
大量のデータをバーストモードでコピーすると割り込みに対する応答が待ちあわないなんてことも発生します。

サイクルスチールモードの場合はCPUもバス権があるタイミングがあるのでDMAが働いていないときよりは遅いものの割り込みを受け付けます。

シリアル通信の受信などの場合は、転送に要するタイミングがほんのちょっとであとは待ち時間となります。したがってバーストモードにするとDMAが終るまでCPUが止まっているようになってしまうので、サイクルスチールモードにします。

プロフィール

ビーコン菅原

Author:ビーコン菅原
組み込み始めてそろそろ25年。マイコンとか電子回路が大好きなんですよー

メールフォーム

名前:
メール:
件名:
本文:

Twitter

カウンター(UV)

月別アーカイブ

11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  03  02  01  12  11  10  09  07  05  02  12  10  09  08  07  05  04  03  11  09  08  07  06  03  02  01  12  11  10  09  08  07  06  05  04  02  12  11  10  08  02  12 

QRコード

QRコード

Designed by

Ad