DMAを使用した際に発生する問題の例を2つ挙げます。1つは、オーバーランで、もう1つはキャッシュと併用した際に発生するメインメモリのデータの消失です。
(1) オーバーランは「Q&Aで学ぶマイコン講座第16回:オーバーランエラーの原因」で詳しく述べましたが、通信機能などで、受信バッファに取り込まれたデータをCPUまたはDMAが読み出さないうちに、次のデータを取り込んでしまい、1つ前の受信データが失われることです。バスアービトレーションがラウンドロビン方式だと、オーバーランは発生しにくいですが、サイクルスチールやバースト方式だとCPUまたはDMAがバスを使うことができずに、バス権を待つ時間が長くなります。その間に通信機能が、次のデータを受け取ってしまうと、オーバーランが発生します。その他の場合でもオーバーランは発生します。
(2) キャッシュを使ったシステム上で、キャッシュが持っているデータと同じアドレスのメインメモリを、DMAが書き換えてしまうと、キャッシュとメインメモリのデータの一貫性が失われてしまいます(図4参照)。
例えば、CPUがメモリにデータを書いたときに、ライトスルー方式だと、キャッシュにデータを書き込まれると同時にメインメモリにも同じデータが書き込まれます。もし、その後、間違ってDMAがメインメモリ上のデータを書き換えてしまうと、キャッシュのデータとメインメモリのデータが異なってしまいます。その後、CPUがそのデータを読み出すと、キャッシュのデータが読まれてしまい、メインメモリの値と異なる値を読み出すことになります。キャッシュとDMAの間で一貫性を保つ仕組みが入っていれば良いのですが、仕組みがない場合は、ユーザーがデータの一貫性を管理しなくてはなりません。
少し便利なDMAの設定方式を紹介します。STマイクロエレクトロニクスのSTM32に搭載されているUSBモジュール専用DMAは、内蔵RAM上にディスクリプター(Descriptor)と呼ばれるテーブルを作り、そのディスクリプターに従ってDMAが転送を行ってくれる方式です。図5の例では、転送元は内蔵RAMで、転送先は通信機能の送信バッファ(Tx FIFO)です。
ディスクリプターには、転送するデータのRAMのアドレスや、転送先のTx FIFO情報が書かれており、DMAはこのディスクリプターの内容に従って転送を行います。異なる転送内容のディスクリプターを複数作って、リンクさせることができますので、ユーザーはその都度、転送内容を変更することなく、自動的に複数の転送を行えます。
Copyright © ITmedia, Inc. All Rights Reserved.