macです。 いきなり説教するのもなんですが... To:を書くのを省略するため、 無関係な記事にReplyするのは、 スレッドを混乱させる大変悪い習慣です。 メールアドレスだけ、copy & pasteして新規メールを書き、 不要な、References:を付けないようご注意ください。 さらに、無関係な記事まで全分引用するのは、 まったく論外です。 関係のある記事にReplyする場合でも、 論旨が変わらない程度に必要部分を引用するように、 心がけてください。 shimizu" さん<t970239@xxxxxxxxxxx> wrote: > DMAとは何なのかがよくわからず、メールを書かせていただきました。 Direct Memory Accessとは、 CPUのRead/Write機能を利用せず、 主として、I/Oデータをmemoryに、 読み込み/書き込みする技術です。 > A/D変換で8bitデータがH8に帰ってくるのですが、 > そのデータ量が多いため、そのデータを外部のメモリに蓄えております。 > 1MHzの速度で次々にA/DからH8にデータが来るのですが、 > DMA転送とやらをしないといけないのかなぁーと思っています。 > メモリには次のデータが来るまでに、アドレス指定をイチイチしなければならず、 上記の通り、CPUでI/O portから、データを読み、 Memoryに転送していたのでは、 間に合わない/他の処理に支障をきたす場合、 DMAを使うのが、もっとも一般的な応用です。 ですので、DMAを使おうとしていること自体は、 「正解」です。 でも、今申し上げた通り、 「もっとも一般的な応用」ですので、 マニュアル/そのた各種解説書に、 そのまま使える例が、多数書いてあります。 それを読んで、分からない個所を、 具体的に質問してください。 今回のように「読み取り」を行うには、 読み込むI/O portのアドレス、 転送先のMemoryの開始アドレス、 転送するデータの個数をセットし、 読み込むタイミングがDMA controllerに伝わるよう、 ハードウエアの準備をしてDMAを開始すると、 転送するデータの個数に達するまで、 CPUは、関与せずデータをmemory(配列)に、 取り込んでくれます。 ただ、DMAで転送するmemory addressは、 CPUのdata address空間と、 共有しており、CPUがatomicな処理をしている期間は、 DMAが、待たされることになります。 そのため、DMA転送中、CPUは何もしないで待機するか、 DMAと競合しないようにするか、 さまざまな制約を潜り抜けてプログラムする必要があり、 DMAを上手に使用するには、それなりの技量が必要で、 場合により、DMAでは確実にデータ収集できない場合も、 結構あります。 1 MHz程度のデータ転送なら、DSPを使えば、 楽にPIOで処理できる範囲ですし、 一度に転送するデータ量が少量なら、 FIFOで間接的に採れば、かえって、 楽に確実に処理できるので、 1. コスト上仕方がない。 2. DMAを勉強したい。 3. DSPなど触ったこともないし、 いまさらシステム設計をやり直すには遅すぎる。 などなど、DMAが本当に第一選択肢なのか、 十分検討することをお勧めします。 いずれにしても、 > DMAとは何なのかがよくわからず 選択すべき技術ではありません。 -- mac