組み込みシステム (PowerPC プロセッサを使用) では、プロセッサ キャッシュを無効にしたいと考えています。どのような手順を踏む必要がありますか?
少し明確にするために、問題のアプリケーションは、可能な限り一定の実行速度を備えている必要があります。同じコード パスを実行する際の可変性は許容されません。これがキャッシュをオフにする理由です。
私は質問に少し遅れており、PPC ですべての低レベルのプロセッサ初期化コードを実行してからしばらく経ちましたが、キャッシュと MMU がかなり緊密に結合されていたことを覚えているようです (1 つを有効にする必要がありました)。他を有効にする) MMU ページ テーブルで、キャッシュ可能な属性を定義できると思います。
つまり、私の要点は次のとおりです。決定論的な時間内に実行する必要があるコードの特定のサブセットがある場合、ページ テーブルでキャッシュ不可として定義されているメモリ領域に (リンカー コマンド ファイルを介して) そのコードを配置する可能性があります。そうすれば、キャッシュの恩恵を受けることができる/すべきであるすべてのコードが恩恵を受け、(願わくば) すべきでないコードのサブセットは恩恵を受けません。
とにかくこの方法で処理するので、後でシステムの一部のキャッシングを有効にしたい場合は、init コードを (再) 書き込む代わりに、MMU ページ テーブルのいくつかのビットを反転するだけで済みます。すべてのページ テーブルとキャッシュを設定します。
E600 リファレンス マニュアルから:
HID0 専用レジスタには、命令キャッシュとデータ キャッシュを無効化、無効化、およびロックするいくつかのビットが含まれています。
データ キャッシュを無効にするには、HID0[DCE] = 0 を使用する必要があります。
命令キャッシュを無効にするには、HID0[ICE] = 0 を使用する必要があります。
電源投入時には、両方のキャッシュが無効になっていることに注意してください。これをアセンブリ コードで記述する必要があります。
キャッシュをオフにすると、まったく役に立ちません。実行速度が桁違いに低下します。このようなシステムを出荷することは決してないため、これらの条件下でのパフォーマンスは重要ではありません。
安定した実行速度を実現するには、次のいずれかの方法を検討してください。
1) キャッシュの一部またはすべてをロックします。Freescale、IBM、および AMCC の現在の PowerPC チップはすべて、この機能を提供します。
2) L2 キャッシュを備えた Freescale チップの場合は、そのキャッシュの一部をオンチップ メモリとしてマッピングすることを検討してください。
おそらく、キャッシュをグローバルに無効にするのではなく、特定のアドレス範囲に対してのみ無効にしたいですか?
一部のプロセッサでは、アドレス範囲の TLB (変換ルックアサイド バッファー) エントリを構成して、各範囲でキャッシュを有効または無効にすることができます。このようにして、メモリ マップド I/O のキャッシュを無効にしても、RAM のメイン ブロックのキャッシュをオンのままにしておくことができます。
私がこれを実行した唯一の PowerPC は PowerPC 440EP (IBM、その後 AMCC 製) だったので、すべての PowerPC が同じように動作するかどうかはわかりません。
どのような PPC コアですか? キャッシュ制御は、さまざまなベンダーのさまざまなコア間で非常に異なります...また、キャッシュを無効にすることは、一般的に、マシンにとって非常に悪いことだと考えられています。古い 8 ビット プロセッサを使用しても同じように動作するほどパフォーマンスが非常に遅くなります (少し誇張されています)。一部の ARM バリアントには、キャッシュの代わりに機能する密結合メモリである TCM がありますが、その機能を備えた PPC バリアントは認識していません。
おそらくより良い解決策は、レベル 1 キャッシュをアクティブに保ち、代わりにオンチップ L2 キャッシュを静的にマップされた RAM として使用することでしょうか? これは、少なくとも最新の PowerQUICC デバイスでは一般的です。