2009-04-26 10 views
2

私はamr音声コーデック(移植/最適化)に取り組んでいます 私はVoiceageから最適化されたバージョンのアームを持っており、テスト。これまでのところ、私のlibで生成されたバイナリは、他のものを約20〜30%上回りました!私はVs2008を使用し、Microsoftコンパイラで生成できるARM命令セットへのアクセスが制限されています。だから私は性能の違いが何であるかを見るために別のコンパイラを探すことを試みました。 私はRVCTコンパイラを持っていますが、elfバイナリ/オブジェクトファイルを生成します。しかし、WinCEでRVCTでコンパイルされたコードを実行する方法を見つける必要があるので、私はwinceの携帯電話(TyTn 2)でテストを実行します。 一部のオプションは です。1)アセンブリリスト(armccの-Sオプション)を生成し、COFF(アーム用MSアセンブラ)を作成できる他のアセンブラでアセンブルを試みます。 2)生成されたELFオブジェクトファイルをコンパイルし、 COFFオブジェクト(gnu binutilsのobjcopyのように思われます) 3)RVCTが提供するfromelfユーティリティを使用してBINファイルを作成し、何らかの方法でビットをマングリングしようとします)WinCE/Window Mobile用RVCTを使用したAMR-nbコーデックのコンパイル

私の最初の試みは、 1つのエクスポートされた関数を持つシンプルなC++ファイルを作成し、RVCTでコンパイルし、その関数をスマートフォンで実行しようとします。 発行されたアセンブリをmsアセンブラでアセンブルすることはできません(これらは互換性がないだけでなく、RVCTコンパイラで生成された命令のいくつかを拒否します;私のケースではASRオペコード) ELFオブジェクトをcoff形式私はそれに関する情報を見つけることができません。 CE用のgccポートがあり、そのツールセットからのobjcopyがタスクを実行できるはずです。しかし、私はそれを働かせることはできません。私は別のスイッチを試しましたが、入力と出力のフォーマットのためにbfdnameとして何を指定する必要があるのか​​よくわかりません。だから、私はそれを働かせることができませんでした。 fromelfを使ってダンプし、生成されたbinファイルを使用することは過度のようですので、私は何かしようとしているか、誰かがすでに同様の作業をしていて助けてくれるかどうか聞いてみることにしました。 基本的には、RVCTコンパイラを使用してコードをコンパイルし、パフォーマンスの違いを確認するだけです。私のコードは、どのcランタイム関数にも依存しません。

ありがとうございました!

+0

ASRについて "opcode" - 本当に、それはマクロのようです。 RVCTアームには、この「オペコード」の多くが使用されています。たとえば、POP/PUSH/RET/LDM/Allシフト(ASR、LSLなど)などがあります。 (ASR Rd、Rx、Y => MOV Rd、Rx、ASR y)。 あなたは例えば、それらをコンパイルするために、MSの腕ASMでマクロを書くことができます。: \t MACRO \t RET \t MOV PC、LR \t MEND – zxcat

答えて

0

ちょうどアップデート... 私はarm-peとarm-elfをサポートするgnu binutilsをコンパイルしました。 変換アーム-COFFをするために腕エルフ:INT:

TEST.OBJ objcopy.exe -I ELF32-littlearm -O PE-アーム-ひるみ-少しtest.o今test.objですが、同じ機能が含まれていますadd(int、int); 問題は、MSのコンパイラはTEST.OBJファイルを拒否していることである:TEST.OBJ:致命的なエラーLNK1136:無効または破損したファイル

私はまた、別のアプローチを試してみました。私はtest.oをsymbolsrec形式に変換しました(私はこの形式については考えていませんが、これは唯一の方法です)、生成されたファイルをarm-peに変換しました。この場合、生成されたtest.objにリンクされたmsコンパイラが、生成されたマシンコードは有効ではありません。 また、gcc-ceでtest.cppをコンパイルして、.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);機能。

あなたはVS2008を使用している言及
0


...私は、Microsoftのコンパイラで生成することができARM命令セットへのアクセスが制限されてきた。だから私は...代替コンパイラを探してみました」 (あなたはWM7をターゲットにできると仮定します...)Windows Mobile 7の最新のCTP SDKを試してみることをお勧めします(hereを参照)。

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

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

関連する問題