2

私は amr 音声コーデック (移植/最適化) に取り組んでいます。voiceage のアーム (WinCE 用) に最適化されたバージョンがあり、パフォーマンス テストの参考として使用しています。これまでのところ、私のライブラリで生成されたバイナリは、他のライブラリよりも約 20 ~ 30% 優れています。私は Vs2008 を使用しており、Microsoft コンパイラで生成できる ARM 命令セットへのアクセスが制限されています。そこで、パフォーマンスの違いが何であるかを確認するために、代替コンパイラを探してみました。RVCT コンパイラがありますが、elf バイナリ/オブジェクト ファイルが生成されます。ただし、Wince 携帯電話 (TyTn 2) でテストを実行しているため、RVCT でコンパイルされたコードを WinCE で実行する方法を見つける必要があります。オプションのいくつかは、1) アセンブリ リストを作成する (armcc の -S オプション)、

私の最初の試みは、エクスポートされた関数を 1 つ含む単純な C++ ファイルを作成し、RVCT でコンパイルしてから、その関数をスマートフォンで実行することです。発行されたアセンブリを ms アセンブラーでアセンブルすることはできません (互換性がないだけでなく、ms アセンブラーは RVCT コンパイラーで生成された命令の一部を拒否します。私の場合は ASR オペコード) 次に、ELF オブジェクトを coff 形式に変換しようとしましたが、それに関する情報が見つかりません。ce 用の gcc ポートがあり、そのツールセットの objcopy がタスクを実行できるはずです。しかし、私はそれを働かせることができません。さまざまなスイッチを試しましたが、入力および出力形式の bfdname として正確に何を指定する必要があるかわかりません。だから、私もそれを機能させることができませんでした。fromelf でダンプして、生成された bin ファイルを使用するのはやり過ぎのようですが、それで、私がやるべきことが何かあるか、または誰かがすでに同様のタスクを行っていて、私を助けることができるかどうか、皆さんに尋ねることにしました。基本的に、コードを RVCT コンパイラでコンパイルして、パフォーマンスの違いを確認するだけです。私のコードは、どの C ランタイム関数にも依存していません。

ありがとう!

4

2 に答える 2

0

Vs2008 を使用しているとのことですが、「... Microsoft コンパイラで生成できる ARM 命令セットへのアクセスが制限されています。そのため、代替コンパイラを探してみました...」

(WM7 をターゲットにできると仮定して...) Windows Mobile 7 用の最新の CTP SDK を試すことをお勧めします (こちらを参照)。

C++ コンパイラでは、以前のリリースよりもコード生成が大幅に改善されていますまた、最新の ARM アーキテクチャをターゲットにすることができます。信じてください、コード生成の品質は非常に高いです。

PS: 私がこれらの機能のいくつかを実装したという事実が、私に少し偏見を持たせているのかもしれません。:)

于 2010-06-12T02:44:02.200 に答える
0

ただの更新... arm-pe と arm-elf をサポートする gnu binutils をコンパイルしました。arm-elf を arm-coff に変換します: objcopy.exe -I elf32-littlearm -O pe-arm-wince-little test.o test.obj

これで、test.obj に同じ関数が含まれるようになりました: int add(int, int); 問題は、ms コンパイラが test.obj ファイルを拒否することです: test.obj : 致命的なエラー LNK1136: 無効または破損したファイル

別のアプローチも試しました。test.oをsymbolsrec形式に変換し(この形式についてはわかりませんが、機能したのはこれだけです)、生成されたファイルをarm-peに変換しました。この場合、ms コンパイラは生成された test.obj にリンクされていますが、生成されたマシン コードは有効ではありません。また、test.cpp を gcc-ce でコンパイルし、生成された .obj ファイルにリンクしようとしましたが、この場合はすべて機能しました。VS デバッガーに表示されるアセンブリ コードは次のとおりです。

        int X2 = add(X, Y);
00012068  ldr         r1, Y, #0x28 
0001206C  ldr         r0, X, #0x2C 
00012070  bl          00011000 

変換された obj ファイルにリンクできた場合、次のようになります。

        int X2 = add(X, Y);
00011068  ldr         r1, Y, #0x28 
0001106C  ldr         r0, X, #0x2C 
00011070  bl          |WinMain + 0xfffff000 ( 10000h )| 

その最後の命令では、 int add(int, int);とは関係のないランダムな場所にジャンプします。関数。

于 2009-04-26T23:48:04.153 に答える