問題タブ [dma]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
usb - エンドポイント データ バッファを DMA 対応にする
現在、SH_MOBILE アーキテクチャを持つカスタム ハードウェアに取り組んでいます。ハードウェアは、USB(ペリフェラル)と 2 チャネルの DMAC が付属しています。メインライン カーネルで利用可能な R8a66597 UDC ドライバーを使用しています。ペリフェラル コントローラ ドライバに DMA 関連の機能を追加しました。現在、DMA を TX パスで動作させることができます。しかし、RX パスでは DMA を使用できず、代わりに PIO が使用されています。これは、バッファ アドレス (struct usb_request の buf) が 8 ビット アラインされていないためです。これらのデータ転送バッファが DMA 対応であることを確認する方法を知りたいですか?
前もって感謝します, Srinidhi KV
memory - 32b PCI デバイスを搭載した x86_64 システムで DMA メモリを使用する方法
レガシー NIC などの 32 ビット デバイスを使用する x86_64 システムの場合: NIC と DRAM の間で DMA を実行する場合、メモリ アドレスは下位メモリ (4GB 未満) にある必要がありますか?
ところで、OS は、PCI デバイス用に予約されたメモリ アドレス空間リソース、つまり BAR に格納されているアドレスをどのように認識するのですか?
caching - CPUキャッシュからではなく、固定された(ロックページ)RAMから読み取るにはどうすればよいですか(GPUでDMAゼロコピーを使用)?
CUDAC++のRAM<->GPUにDMAを使用する場合、メモリがCPUキャッシュからではなく、固定された(ロックページ)RAMから読み取られるようにするにはどうすればよいですか?
結局のところ、DMAの場合、CPUは、誰かがメモリを変更したという事実と、CPU(Cache <-> RAM)を同期する必要性について何も知りません。そして、私が知る限り、C++11のstd::memory_barier()はDMAに役立たず、RAMから読み取れませんが、キャッシュL1 / L2/L3間のコンプライアンスをもたらすだけです。さらに、一般に、CPU上のキャッシュとRAMの間の競合を解決するためのプロトコルはありませんが、NUMAのCPUキャッシュL1 / L2 /L3とマルチCPUの異なるレベルのプロトコルのみを同期します:MOESI / MESIF
low-level - ほとんどのマシンが個々のビットをアドレス指定できないのはなぜですか?
私はビット配列について読んでいて、この質問が頭に浮かびました。ほとんどのマシンが個々のビットをアドレス指定できないのはなぜですか?それはDMAのせいで、各ビットのアドレスを保持するのに(メモリ/回路)コストがかかりすぎるからですか?
linux - 2つのTSI148VMEbusコントローラー間で信頼性の高いDMA転送をセットアップする際の問題
私は助けを求めています。最も重要なのはVMEbusの専門家です。
私は、vxWorks 6.8を実行しているリアルタイムpowerpcコントローラー(Emerson MVME4100)から、カーネル2.6.32でDebian6を実行しているLinuxIntelコンピューター(Xembedded XVME6300)への通信チャネルをセットアップすることを目的としたプロジェクトに取り組んでいます。このチャネルはVMEバス上で実行されます。両方のコンピューターはVMEエンクロージャー内にあり、両方ともTundraTsi148チップセットを使用しています。Intelコンピューターはシステムコントローラーとして明示的に構成されていますが、リアルタイムコンピューターは明示的に構成されていません。
セットアップ:Intelコンピューター用に、4MBのカーネルバッファーを作成し、スレーブウィンドウを使用してVMEバス上で共有するカスタムドライバーを作成しました。リアルタイムコンピューターの場合、正確に48640バイトのブロックを繰り返し転送するようにDMA転送を設定します。テストデータのバイト(0、1、2など)をすばやく連続して(可能であれば32ミリ秒ごとに1回)入力します。Intelコンピューターの場合、ドライバーからカーネルバッファーを読み取り、データが正しく到着するかどうかを確認します。手動で起動したPythonプログラム。
期待:Pythonプログラムから同じデータ(ゼロ、1など)が表示されることを期待しています。選択したバス速度(通常、バス速度に応じて290usまたは145us)にほぼ対応する送信時間と、妥当なDMAセットアップオーバーヘッド(最大10us?数百usecsなどのより大きな数を受け入れる用意があります)を期待しています。それがバスが通常必要とするものである場合)
結果:
- データがまったく届かない場合があり、「送信」時間は約2000usです。
- データが確実に到着する場合もありますが、送信時間は、選択したバス速度に応じて、約98270usまたは98470usです。
質問:どうすれば送信の信頼性を高め、これらの恐ろしい遅延を減らすことができますか?次に検索する一般的な方向は何ですか?
(できればVMEbusでタグ付けしたい)
どうもありがとう
linux - LinuxでGFP_DMAでkmallocを使用すると、なぜ高いアドレスを取得するのですか?
LinuxでDMAデバイス用のデバイスドライバーを作成しています。Linuxデバイスドライバーの第15章では、次のように述べています。
この種の制限があるデバイスの場合、メモリは、GFP_DMAフラグをkmallocまたはget_free_pages呼び出しに追加することにより、DMAゾーンから割り当てる必要があります。このフラグが存在する場合、24ビットでアドレス指定できるメモリのみが割り当てられます。または、汎用DMAレイヤー(後で説明します)を使用して、デバイスの制限を回避するバッファーを割り当てることができます。
私はkmalloc
このように呼んでいます:
次のように結果を出力します。
そして、これは私が見るものです:
0xffff880000180000
GFP_DMAを使用した場合、24ビットに収まらないへのポインタを取得するにはどうすればよいですか?
これは私のメモリブロックの物理アドレスではない可能性がありますか?そうでない場合(つまり、私は完全に誤解していることを意味しkmalloc
ます)、どうすればその物理アドレスを取得できますか?
私はOpenSuse12で働いています。
linux - Linux 2.6.30 DMA API のデバイス メモリのマッピング
私はこれに苦労してきました。本当に助けていただければ幸いです。At91sam9g45 の内部 SRAM (足がかり - 起動後は使用されません) を使用して、集中的な計算を高速化したいのですが、次のすべての条件を満たしていません。
メモリはユーザー空間からアクセスできます。これは、ユーザー空間を使用して
mmap()
からカーネルを使用すると簡単でしremap_pfn_range()
た。返されたポインターを使用して、ユーザー空間プログラムは SRAM の読み取り/書き込みを行うことができます。カーネル DMA API 呼び出し
dma_async_memcpy_buf_to_buf()
を使用して、DMA を使用して memcpy を実行します。私の基本的なドライバー内で、この操作を呼び出して、データを DDR ( kmalloc() で割り当てられた) から SRAM バッファーにコピーしたいと考えています。
したがって、私の問題は、ユーザー空間と物理アドレスがありますが、カーネル空間の DMA API に適したマッピングがないことです。
ioremap を使用して、に提供された固定仮想アドレスを使用してみましたiotable_init()
。これらのいずれも、次のようなもので使用できるカーネル仮想アドレスにはならないようですvirt_to_bus
(これはkmallocアドレスで機能し、DMA API内で使用されていると思います)。
方法はありますが、物理アドレスを使用して DMA を手動でトリガーするだけですが、これを試して理解したいと思います。私はLDD3とグーグルを読んでいますが、DMA API(PCIバスを除く)にkmalloc以外のメモリを使用する例は見当たりません。
linux - デバイス・ドライバーのトレーニング用の DMA 機能を備えた PCI/PCIe カード
PCI/PCIe デバイスを使用するデバイス ドライバーの DMA を学習しようとしています。私のプラットフォームは linux/bsd です。トレーニング用の単純な PCI ボード (単純なデジタル I/O ボードなど) をかなり見つけましたが、DMA を処理できるほど複雑なハードウェアを備えたものはありません。Stackoverflow で、gcc などのオープンソース ツール (例: PowerPC、68HC11、Atmel、8051 など) でプログラムできる何らかのマイクロプロセッサまたは mcirocontroller を搭載した PCI/PCIe カードを知っている人はいますか??
もちろん、キッカーは低コストです...可能であればサブUSD 300.00.
FPGA ベースのボードは必要ありません。なぜなら、FPGA をプログラミングするための Windows ワークステーション (通常) と、FPGA で PCI/PCIe IP コアを作成して操作するために必要なすべての時間が必要だからです。基本的に、私は FPGA の作業に時間を費やしたくありません。デバイスドライバーの仕事がしたい!これは私の唯一のオプションかもしれませんが...
c - UART DMA Tx/Rxアーキテクチャ
重複の可能性:
UART ISRTxRxアーキテクチャ
現在、DMAUARTドライバーと並列タスクをサポートするオペレーティングシステムを含むTIマイクロを使用しています。UARTドライバーの機能は次のとおりです。
- static void HalUARTInitDMA(void);
- static void HalUARTOpenDMA(halUARTCfg_t * config);
- static uint16 HalUARTReadDMA(uint8 * buf、uint16 len);
- static uint16 HalUARTWriteDMA(uint8 * buf、uint16 len);
- static void HalUARTPollDMA(void);
- static uint16 HalUARTRxAvailDMA(void);
- static void HalUARTSuspendDMA(void);
- static void HalUARTResumeDMA(void);
キャリッジリターンで終了したメッセージを受け入れ、その後キャリッジリターンでメッセージを応答する別の周辺機器と通信しようとしています。
このタイプの通信ステートマシンを設計するための最良の方法が何であるかを知りたいと思いました。私の問題は、UARTポートのコールバック関数を次のように設計することです...
- 応答を待ってシステムをハングさせません。(ある種のタイムアウト)
- 応答の読み取りが早すぎると、応答が連結されます
- キャリッジリターンはメッセージの終わりを意味します
基本的な理論は次のようなものです。
このアイデアには明らかな欠陥がいくつかあります。この種のコミュニケーションがどのように行われるかについて、誰かがアイデアを共有してくれることを望んでいましたか?
ありがとう!
arm - OMAP 4460で複数のDMA転送が進行している間、CPUはブロックされていますか?
PandaboardでDMAがどのように機能するかを正確に知りたいです。Pandaboardで使用されているOMPA4460のTRMを読みました。これは、DMAシステムが一度に合計128の要求、最大32の論理チャネル、および4つの割り込み要求を管理できることを示しています。DMAの進行中に、CPUが一度に別のタスクを実行できる可能性はありますか?