2

我正在研究 amr 语音编解码器(移植/优化) 我有一个来自 voiceage 的 arm(用于 WinCE)优化版本,我将它用作性能测试的参考。到目前为止,使用我的 lib 生成的二进制文件比另一个文件高 20-30%!我使用 Vs2008,但我只能使用 Microsoft 编译器生成的 ARM 指令集。所以我试图寻找替代编译器,看看会有什么性能差异。我有 RVCT 编译器,但它会生成 elf 二进制文件/目标文件。但是,我在 wince 手机 (TyTn 2) 上运行我的测试,所以我需要找到一种方法在 WinCE 上运行使用 RVCT 编译的代码。一些选项是 1) 生成汇编列表(armcc 的 -S 选项),

我的第一次尝试是使用一个导出函数创建一个简单的 c++ 文件,使用 RVCT 对其进行编译,然后尝试在智能手机上运行该函数。发出的程序集无法由 ms 汇编器组装(不仅它们不兼容,而且 ms 汇编器拒绝使用 RVCT 编译器生成的一些指令;在我的情况下为 ASR 操作码)然后我尝试将 ELF 对象转换为 coff 格式,我找不到任何相关信息。有一个用于 ce 的 gcc 端口,并且该工具集中的 objcopy 应该能够完成该任务。但是,我无法让它工作。我尝试了不同的开关,但我不知道我需要为输入和输出格式指定什么作为 bfdname。所以,我也无法让它工作。使用 fromelf 转储并使用生成的 bin 文件似乎有点过头了,所以我决定问你们是否有什么我应该尝试做的,或者也许有人已经完成了类似的任务并且可以帮助我。基本上,我想做的就是用 RVCT 编译器编译我的代码,看看性能差异是什么。我的代码对任何 c 运行时函数的依赖性为零。

谢谢!

4

2 回答 2

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,但生成的机器代码无效。我还用 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);无关的某个随机位置。功能。

于 2009-04-26T23:48:04.153 回答
0

你提到你正在使用 Vs2008 和“ ......我只能使用微软编译器生成的 ARM 指令集。所以我试图寻找替代编译器......”

(假设您可以针对 WM7...)我建议您尝试最新的适用于 Windows Mobile 7 的 CTP SDK(请参阅此处)。

与以前的版本相比,C++ 编译器具有巨大的代码生成改进。并且可以针对最新的 ARM 架构。相信我,代码生成质量非常高。

PS:也许我已经实现了其中一些功能的事实让我有点偏见。:)

于 2010-06-12T02:44:02.200 回答