発生した問題

 これまで制御機器のファームウエア開発を担当してきたQさんは,画像機器の新しい開発プロジェクトに参加,信号処理に関するソフトウエア開発チームに入りました。QさんはHDDからのデータ読み出しモジュールを担当していたのですが,以前のプロジェクトで使用した経験のあるDMA(direct memory access)機構を利用してモジュールを実装しました(図8-1)。


(画像のクリックで拡大)

 ところが上位モジュールが指定するアドレスのメイン・メモリにデータを転送した際,まれに正しいデータが読み出せないことがあると報告を受けてしまいました。

原因と対策

 今回のプロジェクトで採用したマイコンは,Qさんが制御機器のファームウエア開発で使用していたマイコンと同じメーカーのもので,搭載されているCPUコアは違っていましたがDMA機構は同じ仕様であることを確認していました。つまり,このマイコンのDMA機構を制御するレジスタの使い方や設定手順などは,ほとんど同じだったのです。Qさんは,以前の製品に搭載された実績のあるDMA制御用のプログラムを流用してモジュールを開発していたので,このような不具合は予想していませんでした。

 そこで,このマイコンの仕様書をもう一度よく読んでみると,メモリに関連するところにキャッシュ機構の記述があることに気付きました。以前の製品の制御機器に搭載したマイコンにはキャッシュ機構がありませんでしたが,今回採用したマイコンは信号処理を高速に実行するため16Kバイトのデータ・キャッシュを搭載していました。また,仕様書にはキャッシュの動作原理や使用上の注意点などが記載されていましたが,特に「コヒーレンシ」という聞き慣れない言葉の説明が目に留まりました。さらに「キャッシュとメイン・メモリのコヒーレンシの保証はソフトウエアで行うこと」と注意書きがありました。

 つまりQさんは,DMAによってHDDからメイン・メモリへ自動的に転送されたデータを使って信号処理を行っているつもりだったのですが,実はCPUはキャッシュのデータを使っていたのでした。メイン・メモリに新しく転送されたデータと,既にキャッシュに取り込まれているデータとの違いをキャッシュ・コントローラが自動的に検出できないため,ソフトウエアによってキャッシュのデータと読み込んだデータを一致させなければなりません(図8-2)。今回の不具合は,まさにこの制約事項に留意していなかったために引き起こされていたのでした。


(画像のクリックで拡大)

 Qさんはマイコンの仕様書を読んで,考えられる対策を洗い出してみました。

(a)DMA転送の際に,一時的にキャッシュのエントリを無効化する。
(b)DMA転送で使用されるデータ領域を,キャッシュ対象外のアドレス空間に配置する。
(c)キャッシュ対象外のアドレス空間に配置したデータ領域へいったんDMA転送しておき,転送後にキャッシュ対象のデータ領域にソフトウエアでメモリ・コピーを行う。

 (a)は,キャッシュ・コントローラの制御レジスタをソフトウエアで操作し,キャッシュに取り込まれているデータをいったん無効にすることで,CPUがデータにアクセスするときに,メイン・メモリからキャッシュへのデータの読み直しを意図的に発生させます(図8-3)。しかし場合によっては,無効にしたくないエントリまで無効化される可能性があります。特に,キャッシュに命令とデータが混在している場合は,キャッシュされた命令も無効になるのでパフォーマンスの低下などに一層注意が必要です。またキャッシュ・エントリの無効化は,可能/不可能も含めて使用するマイコンにより違いがあります。


(画像のクリックで拡大)

 (b)は,キャッシュに取り込まれても効果の薄いデータを扱う場合に有効な方法です。データがキャッシュへ取り込まれるときにはメイン・メモリへのアクセスも発生しているので,特に読み出してから1度しか使用しないデータの場合はキャッシュを利用する効果は薄いといえるでしょう。ただしデータを1度しか使用しない場合でも,連続したアドレスに格納されたデータに続けてアクセスするのであれば,キャッシュを利用すると高速な処理が期待できます。なぜなら,メイン・メモリからキャッシュへデータが取り込まれるときは,キャッシュのライン・サイズ分の取り込みが連続して行われているため,2番目以降のデータがキャッシュからCPUへ高速に読み出されるからです(図8-4)。


(画像のクリックで拡大)

 (c)は,読み込んだデータを確実にキャッシュへ取り込むために有効な方法です。つまり,キャッシュ対象外のデータ領域からキャッシュ対象のデータ領域にソフトウエアでデータを書き込むことで,キャッシュのエントリが自動的に更新されるのです。

 Qさんが設計したモジュールは,画像処理を始める前に1度だけ使用する画像ファイルの設定情報をHDDから読み出すために利用していたので,(b)の方法を採用しました。

技術者必修の基本

 マイコンに搭載されるDMA機構は,CPUのパワーを無駄に使わず効率よくデータ転送できるため,大変重宝する機能です。しかしながら,キャッシュ機構を搭載したマイコンではDMAとキャッシュの連携は不可避であるため,使用するマイコンの仕様書で該当する項目をよく理解しておく必要があります。また,今回の事例ではマイコンへの読み出しについて取り上げましたが,マイコンからの書き出しにDMAを使用する場合も同様の注意が必要です。

 ソフトウエアを作成する技術者は,ハードウエアに関心が薄い場合があります。マイコンに搭載された周辺機能を使用する場合は,使用する機能について知るだけではなく,関連する機能についても理解を深めておくようにしましょう。

マイコンやDMA機構など複数のバス・マスタがアドレス空間を共有するシステムでは,あるメモリ領域に対しておのおののバス・マスタが書き込み動作を実行します。このとき,各マイコンに格納したキャッシュのデータの値が異なる可能性があります。このデータの一貫性のことをコヒーレンシと呼びます。