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

标签 c++ arm windows-ce elf assembly

我正在研究 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/

相关文章:

c++ - 通过opencv中的选定像素裁剪图像

c++ - Neon 指令,vsub_f32(a, b),是 a-b 还是 b-a?

linux - arm和x86之间的迁移过程

windows-ce - Windows CE 6.0 上的 Hklm/Init

C++、回调、对象和最佳实践

c++ - 关于次对角线的转置(翻转)矩阵

C# 应用程序在 Windows CE 中崩溃

c# - ReadMsgQueue 返回 ERROR_INVALID_PARAMETER

java - 无法解析相应的 jni 函数

c - 二元运算是否比 memmove 更快?