我正在开发amr语音编解码器(移植/优化) 我有一个来自语音的手臂(用于WinCE)优化版本,我将其用作性能测试的参考。到目前为止,用我的lib生成的二进制文件比另一个高出20-30%!我使用Vs2008并且我可以使用Microsoft编译器生成对ARM指令集的有限访问权限。所以我试着寻找替代编译器来看看性能差异。 我有RVCT编译器,但它生成elf二进制文件/目标文件。但是,我在wince手机(TyTn 2)上运行我的测试,所以我需要找到一种方法来运行在WinCE上使用RVCT编译的代码。 一些选项是 1)生成汇编列表(armcc的-S选项),并尝试与其他可以创建COFF的汇编程序汇编(用于arm的MS汇编程序) 2)编译并将生成的ELF对象文件转换为COFF对象(看起来像gnu binutils的objcopy可以帮助我) 3)使用RVCT提供的fromelf实用程序创建BIN文件,并以某种方式尝试破坏位,以便我可以执行它们;)
我的第一次尝试是创建一个带有一个导出函数的简单c ++文件,使用RVCT编译它,然后尝试在智能手机上运行该函数。 ms汇编程序无法组装发出的程序集(不仅它们不兼容,而且ms汇编程序拒绝使用RVCT编译器生成的一些指令;在我的情况下是ASR操作码) 然后我试图将ELF对象转换为coff格式,我找不到任何关于它的信息。有一个用于ce的gcc端口和来自该工具集的objcopy应该能够完成任务。但是,我无法让它发挥作用。我尝试了不同的开关,但我不知道我需要为输入和输出格式指定什么作为bfdname。所以,我也无法让它发挥作用。 使用fromelf转储并使用生成的bin文件似乎有点矫枉过正,所以我决定问你们是否有任何我应该尝试的事情,或者某人已经完成了类似的任务并且可以帮助我。 基本上,我想要做的就是使用RVCT编译器编译我的代码,看看性能差异是什么。我的代码对任何c运行时函数都没有依赖性。
谢谢!
答案 0 :(得分:0)
只是更新...... 我编译了gnu binutils,支持arm-pe和arm-elf。 将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); 函数无关的随机位置。
答案 1 :(得分:0)
你提到你正在使用Vs2008和“ ...我对使用Microsoft编译器生成的ARM指令集的访问权限有限。所以我试图寻找替代编译器 ......” BR />
(假设您可以定位WM7 ...)我建议您尝试最新的Windows Mobile 7 CTP SDK(请参阅here)。
与以前的版本相比,C ++编译器具有巨大的代码生成改进。并且可以针对最新的ARM架构。相信我,代码生成质量非常高。