2

私は現在、純粋に楽しみのために、ゲームボーイ アドバンス エミュレーターを作成しています。これにはARM7TDMICPU があり、CPU エミュレーション コードのほとんどは私が書きました。私の質問は、どうやってそれをテストするのですか?

ランダムな GBA ソフトウェアでテストしてもあまり役に立ちません。プログラムは CPU とは関係のない理由でクラッシュする可能性があります。

ARMCPU、特に命令セットをテストする利用可能なプログラムはありますか? いくつかのシミュレーターのソースを調べましたが、ARM探しているものが見つかりませんでした。そうでない場合は、独自のプログラムを作成しますが、テストを包括的にするのは難しいでしょう。

前もって感謝します!

4

3 に答える 3

2

私はRに同意します。最初にCPUをテストするか、エミュレートされたハードウェアとは別にテストします。最初にしっかりとした基盤を持ってください。

私は、命令セットシミュレーターを作成し、それらと開発中の実際のプロセッサーの両方をテストしました。

明らかな指示されたテストがあり、それらが機能することを確認するために特定の指示を対象としています。たとえば、ARMのドキュメントを注意深く見てください。シフトにはif-then-elseの定義があり、シフトが32に等しい場合は、シフトしないなど、if-then-elseでこれらの各条件を検証するテストを作成します。

フラグは、どの命令セットに関係なく常に注意が必要です(もちろんフラグのないものを除く)。追加のために、符号付きオーバーフローと符号なしオーバーフローを正しく取得します(キャリー=符号なしオーバーフロー)。次に、ターゲットプロセッサが減算を処理する方法を理解します。通常、キャリーインと2番目のオペランド(加算器への)を反転する必要があります。あるアーキテクチャが別のアーキテクチャと異なる場合は、キャリーアウト、減算のためにキャリーアウトを反転するもの、しないものがあります。ボロー命令による減算がある場合、キャリーインで反転するかどうかに関係なく、実行ルールがボローによる減算に影響を与えます。幸い、出力が実際のプロセッサーに対して機能することを前提として、これを支援できるCコンパイラーがあります(この一部仕事はプロセッサのバグからコンパイラのバグを分類することであり、あなたがヒットするコンパイラのバグがあります)。すべてゼロ、すべて1、およびすべてゼロの1(0x80000000)の特殊なケースでは、(符号付きの)オーバーフローが正しく機能することを確認するために、直接テストを行う必要があります。一部の操作は一部のフラグにのみ影響するか、一部の操作は一部のフラグをゼロにするなどです。それをテストするシチュエーションを作成してください。ARMはまた、任意の命令を条件付きにし、alu命令でオプションでフラグを変更できるようにすることで、さらに悪化させます。

私は、zlibおよびjpegデコーダー、mp3デコーダー、オープンソースでベアメタル方式でコンパイルできるもの(はい、これらはすでに述べたものです!)、つまりこの場合はオペレーティングシステムなしのものを使用するのが好きです。たとえば、zlibは、longとintの混合に関しては悪夢です。そのため、コンパイラがその日のホストでどのように動作しているかによって異なります(一部のコンパイラでは、ターゲットアーキテクチャではなく、ホストアーキテクチャを使用して変数のサイズを決定する場合があります。クロスコンパイル、それはかなり迷惑です)。ジャンプするすべてのタイプに対してzlibバギーを呼び出すところまで行ったので、プロセッサをプッシュしないために返される値ではなく、コンパイルのデバッグに費やされた時間のために、テストに使用することを減らしました。プロセッサは非常にハードです(私はそれを使用してプロセッサのバグを見つけましたが)。損失の多いjpegおよびmp3デコーダーの場合、ホスト上で計算された、事前に計算された回答が必要です。ソフトフロートを使用する場合を除いて、浮動小数点ではなく整数解が必要です。

コンパイラを使用してテストする場合は、いくつかのことを理解してください。まず、すべての最適化を試してください。コンパイルされたテストごとに、-O0、-O1、-O2、および-O3バージョンがあります。これは、異なる命令ミックスを作成し、さまざまな方法でプロセッサ。ここからコンパイラのバグが発生する可能性がありますが、注意してください。同じコンパイラの異なるバージョンと異なるコンパイラは、異なる出力、異なる命令ミックスを生成します。可能であれば、できるだけ多くの異なるコンパイラを取得し、evalsなどを使用することが望ましいです。コンパイラを評価しているときに、しばらくの間、フルバージョンの無料コピーを提供してくれるコンパイラのバグをいくつか見つけました。YMMV。また、それはあなたにとって不可能かもしれません、さまざまな個人(コーディング標準に大きく準拠していない)は、さまざまな命令の組み合わせ(asm以上)を生成します。各命令を取得した後、理論的には、分離されたときに動作しますが、特定の命令が別の命令に続く場合でもバグが存在する可能性があります。命令ミックスを作成しようとすると便利です。バグが見つからない場合でも、それは良い検証です。私が言及したようにコンパイルされたコードですが、たとえば、ランダマイザーを使用して一連のalu操作を作成し、操作とソースおよび宛先レジスタ(フラグをサンプリングする操作を含む)を選択し、可能であればそのコードを実行することもできます実際のプロセッサで実行し、同じ結果が得られるかどうかを確認します。特定の命令が別の命令に続く場合でもバグが残っていることに気付く場合があるため、バグを見つけられない場合でも、命令ミックスを作成することは有用です。私が言及したようにコンパイルされたコードですが、たとえば、ランダマイザーを使用して一連のalu操作を作成し、操作とソースおよび宛先レジスタ(フラグをサンプリングする操作を含む)を選択し、可能であればそのコードを実行することもできます実際のプロセッサで実行し、同じ結果が得られるかどうかを確認します。特定の命令が別の命令に続く場合でもバグが残っていることに気付く場合があるため、バグを見つけられない場合でも、命令ミックスを作成することは有用です。私が言及したようにコンパイルされたコードですが、たとえば、ランダマイザーを使用して一連のalu操作を作成し、操作とソースおよび宛先レジスタ(フラグをサンプリングする操作を含む)を選択し、可能であればそのコードを実行することもできます実際のプロセッサで実行し、同じ結果が得られるかどうかを確認します。

私が取り組んだプロセッサの1つは、ハードウェアにテストフィクスチャを構築し、テストフィクスチャの周辺機器と通信して、1)一定の速度で割り込みを送信できるようにし、2)特定のアドレスのデータ/プリフェッチアボートを作成しました。だから私はzlibテストを行い、それが実行されている間に割り込みでそれを叩きました、そして割り込みで私は命令のリターンアドレスを見て、数ワード後にプリフェッチアボートを武装させました、時々彼らはヒットしませんでした、それは大丈夫でした、要点は、割り込みにもかかわらずメインアプリケーションを完璧に実行することでした(割り込みを通常どおり続行し、中止すると、アームが解除され、バックアップされて、再試行されます)。少なくとも、割り込みを使ってテストアプリを叩き、トラックインを継続できるようにする必要があります。

残念ながら、GBAのロジックの大部分はグラフィックス側であるため、プロセッサに多大な労力を費やしても、グラフィックスをデバッグする必要があります。疑似メモリデコーダにテストインターフェイスを配置することでそのコードを分離し、ホストアプリケーションに仮想周辺機器をヒットさせることができます。これを行うために常にアームコードをシミュレートする必要はありません。結局のところ、それが最も困難になるであろう既成のゲームをプレイしていると思いますが、そうです、問題のデバッグは非常に難しい場合があります。しっかりしたアームコアを使用すると、デバッグが容易になり、心配することが1つ少なくなり、問題の原因が1つ少なくなると思います。

もう1つの問題は、gbaの設計方法により、アームをサムモードで実行することでパフォーマンスが大幅に向上することです。そのため、検証/デバッグするアームコアのプログラムであるサムモードプログラムが多数表示されます。混合モードなど。

于 2013-01-28T15:46:06.347 に答える
2

あなたの目的がシステム全体のエミュレーターを作成することである場合、CPU エミュレーションが機能するかどうかを心配する前に、少なくとも最低限サポートする必要がある他のシステムを見つけ出し、それらを実装します。グラフィックスとメモリ コントローラーが最も重要な要素として思い浮かびます。また、単体テストを作成するのも簡単です。それらが正常に動作していることを確信できれば、CPU エミュレーションをテストするための適切なツールを用意できます。

そうは言っても、最初にCPUエミュレーションをテストしたい場合は、デバッグコードを追加して命令を逆アセンブルし、すべてのレジスタの値(およびおそらくそれらが指す可能性のあるメモリ内の値)を各命令の前に出力します。次に、いくつかのゲームを実行してみてください。それほど遠くまでは行きませんが、エミュレーション コードがレジスタ/メモリの状態に適切な変更を加えているかどうかを評価するために、膨大な量のデータを参照する必要があります。

于 2013-01-27T23:39:34.907 に答える
1

QEMU は ARM CPU/命令セットに最適です。Balauは、始めるのに最適な記事です。QEMU は、広く使用されている多くのハードウェア プラットフォームで Linux を実行でき、少数の ARM ハードウェア プラットフォームで U-Boot / ベア メタル コードを実行することさえできます。

y ゲームボーイ エミュレータの場合、グラフィックはどのように表示されますか?

于 2013-01-27T23:41:10.397 に答える