「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
DMAとは、「ダイレクトメモリアクセス(Direct Memory Access)」の略で、CPUを介さずに入出力装置と主記憶装置の間でデータ転送を行う方式のことを指します。
Windows98で、「HDDのプロパティでDMAを選択する」等もありましたので、10年くらい前からパソコンを使用されている方は聞き覚えのある言葉だと思います。
データ転送方式は、PIO(プログラムI/O (Programmed I/O))方式というものもあります。この転送方式は、CPUを介してデータ転送を行う方式になります。
DMAは転送方式であるため、実際に制御を行うコントローラが存在します。 パソコンでは、マザーボード上に専用のコントローラを実装してDMAを実現していますが、マイコンでは、CPUの機能として搭載されているものがあります。
今回はマイコンにおけるDMA転送制御について説明していきます。
マイコンでのDMA転送はCPUの一つの機能になり、それを実現するためのコントローラ部分があります。
CPU内部の機能構成は以下のようになります。
図1. CPU内部機能ブロック構成例
DMAコントローラ(DMACと呼ばれます)は入出力装置と主記憶装置の間でデータ転送を行うため、入出力装置に対応する周辺機能へはバスコントローラを介して読み書きを行い、主記憶装置に対応するCPU内蔵ROM/RAMへは内部バスを介して読み書きを行います。
主記憶装置が外部ROM/RAMになる場合は、バスコントローラを介します。
マイコンのDMAでは、内部ROM/RAM、外部ROM/RAM、内蔵周辺機能、外部アドレスが転送元、転送先として選択することができるようになっています。
バスには使用権があり、使用権をもつ可能性があるものはバスマスタと呼ばれます。
マイコンでは、CPUコア、DMACなどがバスマスタになります。
バスの使用権は1度に1つのバスマスタが占有することが出来ます。
バスマスタはバスの使用権を獲得してから、読み込み、書き込みの動作を行うことになるため、CPUがバス使用権を持っているときは、DMACはバスを使用できず、転送動作が行えなくなります。 逆にDMACがバス使用権を持っているときは、CPUは動作できない(プログラム実行ができない)ということになります。
バスマスタが複数存在するときに、バス使用権の調停(arbitration)をするものがバスアービタと呼ばれます。この機能はバスコントローラに含まれるものになります。
マイコンでのPIO転送は、ソフトウェアによるROM/RAM/周辺機能への読み書きになります。データ転送にソフトウェアが介在するため、データ転送にプログラム処理時間が加わることになります。
図2. マイコンによるPIO転送の動作例
CPUでのソフトウェア(プログラム)の実行は、命令フェッチ(命令コードの読み込み)、デコード(命令コードの解析)、命令実行(命令コードに対応する動作)の流れになり、命令フェッチ、命令実行時に内部バス、外部バス、周辺機能バスを使用することになります。
DMA転送では、データ転送をDMAコントローラが行うことになります。 データ転送にはソフトウェアが介在しないため、PIOよりも高速にデータ転送を行うことが可能になります。 しかし、データ転送はソフトウェアから指定したサイズ、回数で行われるため、細かいチェックを行うことはできず、単純なデータ転送のみとなります。
図3. マイコンによるDMA転送の動作例
DMAを使用する場合の問題点と注意点について説明します。
DMA転送の使用はソフトウェアのパフォーマンスアップに効果が出ると考えられますが、データ転送が集中することによりバスの占有時間が長くなることを考慮する必要があります。
DMAコントローラがデータ転送を行うためにCPUのバス使用権を占有することが多くなってしまい、ソフトウェアの実行が通常よりも遅くなるということがあります。
特に組み込み機器では、複数の通信を行うことや、1マイクロ秒単位での制御を行うようなこと、時間のズレが出ないような制御を行うことがあるため、データ転送でバスが占有されて、メイン処理が動かなくなるというのは大きな問題になります。
このような問題を回避するために、適切にDMA転送でのバスモード(サイクルスチールモード(※1)、バーストモード(※2))を選択することや、組み込みシステム(ソフトウェア)動作に影響が出ないように転送回数を分割するなどの対策を取る必要があります。
データキャッシュを搭載するCPUでDMAを使用する場合、プログラムでのデータ読み出しと実際のRAMのデータが異なる現象になり、期待通りの動きをさせることが出来ないことがあります。ソフトウェアブレークで止めると正常に見えるため、問題発生時に原因の特定まで時間がかかるということもあります。
この現象は、CPU(ソフトウェア)からのメモリアクセスはキャッシュを通り、DMAがキャッシュを通らないことによるコヒーレンシ問題(キャッシュと実メモリの不一致)になります。コヒーレンシはソフトウェアが考慮する問題であるため、ソフトウェアの設計時に問題の発生有無、対処方法を決めておく必要があります。
対処方法としては、キャッシュを無効にする(キャッシュを使用しない、キャッシュエントリを更新する)、キャッシュ無効アドレスでアクセスを行うことが考えられます。マイコンでのSCI(Serial Communication Interface:シリアルコミュニケーションインターフェース)送信について、DMAを使用しない場合(ソフトウェア処理)とDMAを使用する場合の例を説明します。
DMA転送を使用しないでSCI送信を行う場合、以下のようになります。
図4. DMA転送を使用しないSCI送信の動作例
通信フォーマットをもとに、SCIの動作設定を行います。
SCIの送信データレジスタが空きになった場合、INTC(Interrupt Controller:割り込みコントローラ)へ送信データレジスタ空き割り込み発生を出します。 INTCからCPUへ割り込み発生を通知することで、ソフトウェアによる割り込み処理が実行されます。
送信データレジスタ空き割り込みの中で、外部RAMにある送信データを読み込み、SCIの送信データレジスタへ書き込みを行います。
割り込み処理を使用すると、割り込み要因発生から割り込み処理ハンドラの呼び出し、割り込み処理実行、割り込み処理終了(元実行していたアドレスに戻る)という処理が行われることになり、1バイト送信するために一定の処理時間が必要になります。
DMA転送を使用してSCI送信を行う場合、以下のようになります。
図5. DMA転送を使用したSCI送信の動作例
通信フォーマットをもとに、SCIの動作設定を行います。
DMAでの転送元をRAM or ROM、転送先をSCIの送信データレジスタに設定します。 この設定にすると送信データレジスタ空き発生がDMA転送開始のトリガになります。
設定完了後、DMACに転送開始を指示します。
SCIの送信データレジスタが空くとDMACにより、転送元から転送先へデータ転送が行われ、SCI機能によりデータ送信が行われます。
指定回数の転送が完了したあと、DMACからINTCへ転送完了割り込み要求を出します。 INTCからCPUへ割り込み発生を通知することで、CPU(ソフトウェア)は指定回数の送信が完了したことを知ることができます。
DMA転送を使用した場合は、1バイトごとに割り込み処理が実行されることがなく、送信可能になった時点で送信データがセットされる動作になり、ソフトウェアは別の処理を行うことができるようになります。
DMA転送を使用することにより、ソフトウェア負荷を軽減することや、データ転送時間の短縮を行うことができるようになり、パフォーマンス向上が期待できます。 特に組み込み機器では時間制約が厳しいことが多いため、処理時間に余裕を持たせるため使用されることがあります。
このようにCPUの機能を使用して、目的の性能を発揮させることができるところも組み込みソフト開発の面白さであると思います。
(Y.S.)
関連ページへのリンク
関連するソフテックだより