gpt4 book ai didi

c++ - 使用 RVCT 为 WinCE/Window Mobile 编译 AMR-nb 编解码器

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:35 35 4
gpt4 key购买 nike

我正在研究 amr 语音编解码器(移植/优化)我有一个来自 voiceage 的 arm (for WinCE) 优化版本,我用它作为性能测试的引用。到目前为止,用我的库生成的二进制文件比另一个库生成的二进制文件高出大约 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 运行时函数都具有零依赖性。

谢谢!

最佳答案

只是更新...我编译了支持 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 : fatal error LNK1136: invalid or corrupt file

我还尝试了另一种方法。我将 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); 函数无关的某个随机位置。

关于c++ - 使用 RVCT 为 WinCE/Window Mobile 编译 AMR-nb 编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790650/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com