組み込みCPUのDMAのポイントは何ですか?


17

私は最近、mbed(LPC1768)を使用してプロジェクトを行い、DACを使用してさまざまな波を出力しました。データシートの一部を読みましたが、多くの周辺機器でDMAがどのように使用されているかについて説明しました。これは役に立つように思えましたが、さらに読むと、DMAはCPUと同じデータバスを使用していることがわかりました(これは正常なことだと思います)。これは、DACがデータを取得している間、CPUがメモリと対話できないことを意味しますか?また、DACには(私が知る限り)バッファーがなかったため、非常に頻繁にDMAする必要があるため、DMAのポイントは何ですか?CPUがメモリトランザクションを実行できない場合、何か実行できますか?


8
CPUの機能と、メモリにアクセスする以外のことができるかどうかを確認することをお勧めします。決定や計算などを実行できるCPUのことを聞いたことがありますが、これが一般的かどうかは
わかり

CPUはデータをI / Oポートに転送するのに時間を費やすべきですか、それとも専用デバイスにタスクを委任すべきですか?
ステンレス鋼

はい、CPUは他の処理を実行できますが、組み込みシステムでは、おそらく周辺機器、特にI / Oポートとのインターフェイスに多くの時間を費やしているでしょう。DMA専用のデータバスを追加する方が合理的ではないでしょうか。それとも通常は必要ありませんか?余分なバスが必要な状況は、ハードウェアの限界を押し広げようとしているときです。とにかく、DMAをやりたいと思うときでしょうか。
BeB00

1
簡単な例として、情報をシリアルポートに大量に印刷したいとします。座って各バイトが送信されるのを待って(低速)、バッファにコピーしてから、CPUの割り込みを使用して、ポートの準備ができたときに各バイトを送信します(コンテキストスイッチングの数=低速)、またはCPUが他の処理を実行している間に、DMAコントローラーがデータをタイムアウトさせます(高速化が可能です)。
トムカーペンター

2
かつてEDNの表紙を見ましたが、それは巨大な3フィートの長い靴をはいた男性の絵と「靴ならそれを着てください」という見出しを示していました。要点は、部品が不要なことを10個、必要なことを1つ行い、価格、設置面積、および電力バジェットがすべて適合する場合、それを使用するだけで、何かを探す時間を無駄にしないことです。より少ない機能で。
ソロモンスロー

回答:


17

LPC1768データシート私が見つけ、以下の引用符(強調鉱山)は:

SSP、I2Sバス、UART、アナログ-デジタルおよびデジタル-アナログコンバーター周辺機器、タイマー一致信号、およびメモリから使用できるAHB多層マトリックス上の8チャネル汎用DMAコントローラー(GPDMA) -メモリ転送。

スプリットAPBバスにより、CPUとDMA間のストールがほとんどない高スループットが可能

6ページのブロック図は、AHBマトリックス間に複数のチャネルがあるSRAMを示しており、次の引用文がこれを裏付けています。

LPC17xxには、合計64 kBのオンチップスタティックRAMメモリが含まれています。これには、高速バス上のCPUおよびDMAコントローラーからアクセス可能なメイン32 kB SRAMと、AHBマルチレイヤーマトリックスの個別のスレーブポートにある各16 kBの各SRAMブロックが含まれます。このアーキテクチャにより、CPUおよびDMAアクセスを、同時にアクセスできる3つの個別のRAMに分散できます。

そして、これは次の引用によって補強されます:

GPDMAは、ペリフェラルからメモリ、メモリからペリフェラル、ペリフェラルからペリフェラル、およびメモリからメモリへのトランザクションを可能にします。

したがって、メインSRAMを他の機能に使用しながら、個別のSRAMブロックの1つまたは異なる周辺機器からDACにデータをストリーミングできます。

この種のペリフェラル-ペリフェラルDMAは、メモリインターフェイスが非常に単純な(最新のIntelプロセッサと比較して)小規模なパーツで一般的です。


ああ、ありがとう、私はそれが可能であることに気づかなかった、私はDMAに少し新しいです。これは、DACが別のSRAMにアクセスしている間にCPUが周辺機器にアクセスできることを意味しますか?
BeB00

1
はい-これはまさにAHBマトリックスの目的です。異なるコントローラー(CPU、DMA、イーサネットやUSBなどの特定の周辺機器)が同時に異なるものにアクセスできるようにします。これが、SRAMに複数の「ポート」がある理由です。
デビッド

うん、これらの安価な小さな生き物でAHBが原因並列メモリバンクへの非常識なメモリ帯域幅を提供します。あなたは、イーサネットを持つことができ、USB2と最大スループットですべて実行し、CPUはしないでも予告...
peufeu

また、サムコードは1つの32ビットワードに2つの命令を入れることができるため、CPUは、ほとんどの場合レジスタを伴う演算または演算を実行するときにバスにアクセスする必要がない場合があります...反対に、M3およびM4は複数のバスがあるため、クロック(命令およびデータ)ごとに複数のメモリアクセスを実行します。
プーフー

30

長所と短所は、DMAはCPUがネイティブ速度で効果的に動作できるのに対して、周辺機器はネイティブ速度で効果的に動作できることです。例のほとんどの数字は構成されています。

ADCから定期的にデータを収集する2つのオプションを比較してみましょう。

  1. 割り込みの一部としてADCを設定できます(定期的またはその他)
  2. バッファを作成し、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サイクルよりはるかに優れています。


2
CPUがデータを保存できる場所はRAMだけではないことに注意してください。一般に、CPUは、作業する前にRAMからレジスタにデータをロードします。
アロン

うん、絶対に正しい。私の例は純粋にラフなスケッチです。
pgvoorhees

多くのマイクロコントローラーには多層バスも搭載されているため、同時操作が可能です。例:adc-> ramとflash-> registerを同時に。また、多くの命令は1クロックより長いため、DMAには十分な時間があります。
Jeroen3

9

特定のサイクルで、プロセッサとDMAコントローラが同じバスにアクセスする必要がある場合、どちらか一方が待機する必要があります。ただし、多くのシステムには、CPUが1つのメモリにアクセスし、DMAコントローラーが別のメモリにアクセスすることを可能にするバス「ブリッジ」とともに、個別のバスを持つ複数のメモリ領域が含まれます。

さらに、多くのCPUはサイクルごとにメモリデバイスにアクセスする必要がない場合があります。CPUが通常3サイクルのうち2サイクルでメモリにアクセスする必要がある場合、優先度の低いDMAデバイスは、メモリバスがアイドル状態のときにサイクルを悪用できる可能性があります。

ただし、DMAサイクルごとにCPUが1サイクル停止する場合でも、CPUが着信データ項目間で他のことを実行できるほど遅い速度でデータが到着する場合、DMAは依然として非常に役立ちます。 、ただしアイテムごとのオーバーヘッドを最小限に抑えるのに十分な速度です。たとえば、SPIポートが16 CPUサイクルごとに1バイトのレートでデバイスにデータを供給している場合、各転送でCPUに割り込みをかけると、割り込みサービスルーチンに出入りする時間のほとんどすべてを費やす可能性が高くなります。実際の作業を行います。ただし、DMAを使用すると、DMA転送ごとにCPUが2サイクル停止する場合でも、オーバーヘッドを13%に削減できます。

最後に、一部のCPUでは、CPUがスリープしている間にDMAを実行できます。割り込みベースの転送を使用するには、転送されるデータの各ユニットに対してシステムが完全に起動する必要があります。ただし、DMAを使用すると、バイトが入るたびにスリープコントローラーがメモリコントローラーに2、3クロックを供給し、他のすべてをスリープ状態にして、消費電力を削減できる場合があります。


1
LPC1768などのCortex-Mパーツには、フラッシュから命令デコーダーへの個別のメモリパスがあるため、実際にはレジスタ間操作により、CPUがデータメモリにアクセスする必要がある間に複数の命令を実行できます。
クリスストラットン

5

プログラマーとして、DMAは、それをサポートする周辺機器との間でデータを転送するためのオプションです。SPIやUARTなどのシリアルペリフェラルを介して大きなバッファをシフトしたり、ADCから多数のサンプルを収集したりする典型的な例では、そのデータを移動する3つの方法があります。

  1. ポーリング方法。これは、次のバイトにシフトイン/シフトアウトできるように、レジスタフラグを待機する場所です。問題は、これを待っている間、CPUのすべての実行を保留していることです。または、オペレーティングシステムでCPU時間を共有する必要がある場合は、転送が大幅に遅くなります。

  2. 割り込み方法。ここで、すべてのバイト転送で実行される割り込みサービスルーチン(ISR)を記述し、転送を管理するISRにコードを記述します。CPUは、必要な場合にのみISRを処理するため、CPUの効率が向上します。ISRを除き、他のすべての時間に無料で使用できます。ISRは、転送速度に関して転送を行うためのより高速なオプションの1つでもあります。

  3. DMA。あなたは、ソース/デスティネーションポインター、転送の数でDMAを設定します。転送を完了するためにバスサイクルとCPU時間を盗み、CPUはその間に他のことを自由に行うことができます。転送が完了したことを示すフラグまたは割り込みを設定できます。通常、ISRよりもタッチが速く、通常は最速の転送オプションです。

プログラマーとして、私はDMAを好みます。DMAが最も簡単にコーディングでき、本質的に転送を行う最速の手法だからです。通常、ソース/デスティネーションポインター用のレジスターをいくつか設定し、転送回数を設定するだけで、それを実行できます。ISRコードは重要な設計スキルを必要とし、コーディング、テスト、検証などを行う必要があるため、DMA加速コードでの作業よりもISRコードでの作業にはるかに多くの時間を費やしています。DMAコードははるかに小さく、比較的些細なことで、最大の転送速度が得られます。

私の経験では、最近Atmel SAM3 / 4プロセッサーを使用した場合、DMAは自分のクラフトの効率的なISRよりも高速に動作します。5ミリ秒ごとにSPIから大量のバイトを読み取るアプリケーションがありました。バックグラウンドタスクでは多くの浮動小数点演算が行われていたため、これらのタスクではCPUをできるだけ解放する必要がありました。最初の実装はISRでした。その後、DMAに移動して比較し、サンプル間でもう少しCPU時間を購入しようとしました。転送速度のゲインはわずかに改善されましたが、ほんの少しだけです。Oスコープではほとんど測定できませんでした。

私が見た最近のマイクロプロセッサでは、ISRとDMAはほぼ同じ方法で動作しているため、必要に応じてCPUサイクルがかかり、DMAは効率的なISRでコーディングしたCPUと本質的に同じ動作をしているためです。

まれに、DMAによってのみアクセス可能な独自のRAM領域を持つ周辺機器を見てきました。これはイーサネットMACまたはUSB上にありました。


3

ここでDMAを使用する可能性が最も高いのは、DACに一定のタイミングを持たせ、既知の間隔でアナログ出力を変更して波形を生成できるようにするためです。

はい、共有バスの場合は...共有する必要があります。

CPUは常にバスを使用しているとは限らないため、dmaエンジンと共有することをお勧めします。そしてもちろん、優先順位が関係することを意味します。時には最初にそこに着いた人だけである場合があります(たとえば、リソースの前にコマンドfifoを持ち、到着順にfifoのアップリクエストを持っています、はいは必ずしも決定的ではありません) )。このような場合、DACやADCのような時間に敏感な要素が確定的なタイミングを持つように、CPUよりCPUを優先させることができます。実装方法の選択に依存します。

人々は時々、dmaが無料であるというこのしばしば間違った仮定を持っています。CPU時間と共有される場合(最終的にCPUと通信できるリソースと通信する場合)、CPUおよび/またはDMAが保留されるため、CPU時間はまだ待機する必要があります。いくつかの実装では(マイクロコントローラーではない可能性があります)、CPUはdmaが完了するまで完全に保持され、CPUはその間停止します。実装に依存します。その自由な部分は、CPUがデータを供給するために何らかのイベントのために絶えず中断したりポーリングしたり息を止めたりする必要がないことです。dma overの次のバッファーを作成するには時間がかかる場合があります。dma転送を完了して処理するために監視する必要がありますが、すべてのバイトが複数のバイト、つまりデータのブロックであると言う代わりに。

普遍的な答えはありません。「それは」…あなたが使用している特定のものの特定の設計に依存します。1つのチップ/ボード/システム設計内であっても、複数のdmaエンジンが存在する可能性があり、それらがすべて同じように機能すると想定する理由はありません。すべてのインスタンスについて、それを把握する必要がありますが、残念ながら、多くの場合、ドキュメント化されていないか、十分にドキュメント化されています。そのため、懸念がある場合は、いくつかの実験を作成する必要があります。


埋め込まれたメモはそれとは何の関係もありません。dmaのポイントは、おそらくCPUを使用することでパフォーマンスを向上させ、コードを必要とせず、通常は使用されないバスサイクルを利用して作業を行うことです。また、理想的なCPUオーバーヘッドなしで、適​​切なタイミングでデータを供給するというあなたの質問のようなもののために。これらの利点は、埋め込まれていてもいなくても便利です。
old_timer

1

これまでの回答では、CPUが動作できる「速度」とDMAがそれをどのように活用するかについて説明しています。ただし、別の考慮事項、powerがあります。

CPUが低速リンクでデータのパケットを送信したい場合、ポーリングまたは割り込みを使用する場合、ほとんどの時間、スリープ状態にある必要がありますが、DMAの実行中にメインCPUがスリープ状態になる可能性があります。


0

STM32H7シリーズなどの一部のプロセッサには、多くのRAMオプションと密結合RAMのヒープがあります。別々のRAMバンクを使用すると、DMAは1ロットのRAMを処理できますが、プロセッサはキャッシュを必要とせず、DMAによって処理されない密結合RAMでデータを処理します。データを移動するには、MDMAを使用できます。これらのいずれかを使用してFMCWレーダーセットを作成しました。ADCは、2つの入力からIQデータを1つのSRAMに取り込みます。次に、データをスケーリングし、dtcm ramで浮動小数点256ビン複素数fftを実行します。次に、MDMAを使用して、結果をAXI ramの2D配列にFIFOします。

私は速度ベクトルのためにFIFOを横切って2番目のfft 64ビンを取ります。次に、複素数データの大きさを計算し、検出に12.5 MHzのSPIを使用して、結果のデータ128​​および64の浮動小数点値を別のH7に送信します。これはすべて4ミリ秒で完了します。

ADCのサンプリングレートは84 kHzで、オーバーサンプリングを使用すると、約18ビットの解像度が得られます。

MHz範囲でのみ動作し、外部RAMを持たない汎用プロセッサにとっては悪くありません。

また、このデバイスの大きなキャッシュにより、dtcm以外の計算のパフォーマンスも向上しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.