メディア
連載
» 2016年08月22日 11時30分 公開

Q&Aで学ぶマイコン講座(29):DMAのメリットって何? (3/3)

[菅井賢(STマイクロエレクトロニクス),EDN Japan]
前のページへ 1|2|3       

使用上の注意事項

 DMAを使用した際に発生する問題の例を2つ挙げます。1つは、オーバーランで、もう1つはキャッシュと併用した際に発生するメインメモリのデータの消失です。

(1) オーバーランは「Q&Aで学ぶマイコン講座第16回:オーバーランエラーの原因」で詳しく述べましたが、通信機能などで、受信バッファに取り込まれたデータをCPUまたはDMAが読み出さないうちに、次のデータを取り込んでしまい、1つ前の受信データが失われることです。バスアービトレーションがラウンドロビン方式だと、オーバーランは発生しにくいですが、サイクルスチールやバースト方式だとCPUまたはDMAがバスを使うことができずに、バス権を待つ時間が長くなります。その間に通信機能が、次のデータを受け取ってしまうと、オーバーランが発生します。その他の場合でもオーバーランは発生します。

(2) キャッシュを使ったシステム上で、キャッシュが持っているデータと同じアドレスのメインメモリを、DMAが書き換えてしまうと、キャッシュとメインメモリのデータの一貫性が失われてしまいます(図4参照)。

図4 キャッシュとメインメモリのデータの一貫性問題 図4:キャッシュとメインメモリのデータの一貫性問題(例) (クリックで拡大)

 例えば、CPUがメモリにデータを書いたときに、ライトスルー方式だと、キャッシュにデータを書き込まれると同時にメインメモリにも同じデータが書き込まれます。もし、その後、間違ってDMAがメインメモリ上のデータを書き換えてしまうと、キャッシュのデータとメインメモリのデータが異なってしまいます。その後、CPUがそのデータを読み出すと、キャッシュのデータが読まれてしまい、メインメモリの値と異なる値を読み出すことになります。キャッシュとDMAの間で一貫性を保つ仕組みが入っていれば良いのですが、仕組みがない場合は、ユーザーがデータの一貫性を管理しなくてはなりません。

少し便利なDMA(ディスクリプター方式)

 少し便利なDMAの設定方式を紹介します。STマイクロエレクトロニクスのSTM32に搭載されているUSBモジュール専用DMAは、内蔵RAM上にディスクリプター(Descriptor)と呼ばれるテーブルを作り、そのディスクリプターに従ってDMAが転送を行ってくれる方式です。図5の例では、転送元は内蔵RAMで、転送先は通信機能の送信バッファ(Tx FIFO)です。

図5 ディスクリプターを用いたDMA 図5:ディスクリプターを用いたDMA (クリックで拡大)

 ディスクリプターには、転送するデータのRAMのアドレスや、転送先のTx FIFO情報が書かれており、DMAはこのディスクリプターの内容に従って転送を行います。異なる転送内容のディスクリプターを複数作って、リンクさせることができますので、ユーザーはその都度、転送内容を変更することなく、自動的に複数の転送を行えます。

連載バックナンバーはこちら

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.