3

我正在尝试使用 GCC 为 Cortex-M3 处理器构建外部函数接口库。根据http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html

-mthumb
为 Thumb 指令集生成代码。默认使用 32 位 ARM 指令集。此选项根据 -mcpu=name 和 -march=name 选项自动启用 16 位 Thumb-1 或混合 16/32 位 Thumb-2 指令。该选项不传递给汇编器。如果你想强制汇编器文件被解释为 Thumb 代码,要么在源代码中添加一个 `.thumb' 指令,要么将 -mthumb 选项通过前缀 -Wa 直接传递给汇编器。

我尝试将各种不同的参数传递给汇编程序,但似乎无法弄清楚。典型输出如下:

构建文件:../source/ffi/sysv.S
调用:GCC Assembler
arm-bare_newlib_cortex_m3_nommu-eabi-gcc -Wa,-mthumb-interwork -I"/home/neil/m3projects/robovero/firmware/include"-o" source/ffi/sysv.o" "../source/ffi/sysv.S"
../source/ffi/sysv.S:汇编器消息: ../source/ffi/sysv.S:
145:错误:已选择处理器不支持 ARM 操作码
../source/ffi/sysv.S:147:错误:尝试在 Thumb-only 处理器上使用 ARM 指令 -- `stmfd sp!,{r0-r3,fp,lr}'
...

我可以在 Cortex-M3 上使用 libffi 而不成为组装专家吗?

可能值得注意的是,当我直接调用 arm-bare_newlib_cortex_m3_nommu-eabi-as 时,我得到了不同的错误。

4

4 回答 4

2

我修改sysV.S如下,错误是由“.arm”指令引起的,使用cortex-m3时,应该注释掉。

#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
#undef __THUMB_INTERWORK__
#endif

#if __ARM_ARCH__ >= 5
# define call_reg(x)    blx x
#elif defined (__ARM_ARCH_4T__)
# define call_reg(x)    mov lr, pc ; bx x
# if defined(__thumb__) || defined(__THUMB_INTERWORK__)
#  define __INTERWORKING__
# endif
#else
# define call_reg(x)    mov lr, pc ; mov    pc, x
#endif

/* Conditionally compile unwinder directives.  */
#ifdef __ARM_EABI__
#define UNWIND
#else
#define UNWIND @
#endif  


#if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
.macro  ARM_FUNC_START name
    .text
    .align 0
    .thumb
    .thumb_func
#ifdef __APPLE__
    ENTRY($0)
#else
    ENTRY(\name)
#endif
#ifndef __ARM_ARCH_7M__ /* not cortex-m3 */
    bx  pc
    nop
    .arm
#endif
    UNWIND .fnstart
/* A hook to tell gdb that we've switched to ARM mode.  Also used to call
   directly from other local arm routines.  */
#ifdef __APPLE__
_L__$0:
#else
_L__\name:
#endif
.endm
于 2012-11-01T02:55:04.617 回答
1

我不想这么说,但这是一种移植工作。可行,不一定要成为汇编专家,但需要学习一些。从拇指到手臂很容易,拇指 2,我必须查一下,拇指 2 的大部分内容只是拇指指令。拇指与手臂指令具有一对一的映射关系,但反之则不然。Thumb 主要将您限制在所有主力指令的低 8 个寄存器中,使用特殊版本或使用高位寄存器的特殊指令。你的许多手臂指令将变成不止一个拇指指令。

最初看看是否有一个构建选项可以在不使用汇编程序的情况下构建这个包,或者进入那个目录,看看你是否可以在 makefile 中做一些事情来使用 C 程序而不是汇编程序。我认为使用 C 存在严重的性能问题,这就是为什么要从汇编程序开始。Thumb2 理论上比 arm 更有效,但这并不一定意味着从 arm 到 thumb2 的直接端口。因此,有了一些经验,您也许可以将端口移植到 thumb2 并保持一些性能。

编辑:

下载了有问题的文件。前面的定义意味着它知道 thumb 和 armv7m。这就是你如何到达你改变stm来推动的地方吗?

于 2011-02-07T18:32:35.070 回答
0

汇编器告诉你真相 - ARM 汇编代码无法在 M3 等仅限 Thumb-2 的处理器上成功运行。汇编器无法将 ARM 指令助记符映射到对 Cortex-M3 有意义的操作码中。您需要将汇编文件移植到 Thumb-2 汇编代码才能正常工作。根据原始汇编代码的作用,您可能会很幸运并能够移植到 C,但这可能会使您的性能受到重大影响。

于 2011-01-16T05:08:52.743 回答
0

将“-Wa,-mimplicit-it=thumb”添加到 gcc CFLAGS 以避免“thumb 条件指令应该在 IT 块中”错误

--- libffi.orig/src/arm/sysv.S
+++ libffi/src/arm/sysv.S
@@ -91,6 +91,10 @@
 # define __ARM_ARCH__ 7
 #endif

+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+#undef __THUMB_INTERWORK__
+#endif
+
 #if __ARM_ARCH__ >= 5
 # define call_reg(x)   blx x
 #elif defined (__ARM_ARCH_4T__)
@@ -121,9 +125,11 @@
 #else
    ENTRY(\name)
 #endif
+#ifndef __ARM_ARCH_7M__ /* not cortex-m3 */
    bx  pc
    nop
    .arm
+#endif
    UNWIND .fnstart
 /* A hook to tell gdb that we've switched to ARM mode.  Also used to call
    directly from other local arm routines.  */
@@ -164,6 +170,10 @@ _L__\name:
 #endif
 .endm

+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+   .syntax unified
+#endif
+
    @ r0:   ffi_prep_args
    @ r1:   &ecif
    @ r2:   cif->bytes
@@ -180,7 +190,11 @@ ARM_FUNC_START ffi_call_SYSV
    UNWIND .setfp   fp, sp

    @ Make room for all of the new args.
+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+   sub sp, sp, r2
+#else
    sub sp, fp, r2
+#endif

    @ Place all of the ffi_prep_args in position
    mov r0, sp
@@ -193,7 +207,12 @@ ARM_FUNC_START ffi_call_SYSV
    ldmia   sp, {r0-r3}

    @ and adjust stack
+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+   mov lr, sp
+   sub lr, fp, lr  @ cif->bytes == fp - sp
+#else
    sub lr, fp, sp  @ cif->bytes == fp - sp
+#endif
    ldr ip, [fp]    @ load fn() in advance
    cmp lr, #16
    movhs   lr, #16
@@ -305,7 +324,13 @@ ARM_FUNC_START ffi_closure_SYSV
    beq .Lretlonglong
 .Lclosure_epilogue:
    add sp, sp, #16
+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+   ldr     ip, [sp, #4]
+   ldr     sp, [sp]
+   mov     pc, ip
+#else
    ldmfd   sp, {sp, pc}
+#endif
 .Lretint:
    ldr r0, [sp]
    b   .Lclosure_epilogue
@@ -381,7 +406,12 @@ LSYM(Lbase_args):
    ldmia   sp, {r0-r3}

    @ and adjust stack
+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+   mov lr, sp
+   sub lr, ip, lr  @ cif->bytes == (fp - 64) - sp
+#else
    sub lr, ip, sp  @ cif->bytes == (fp - 64) - sp
+#endif
    ldr ip, [fp]    @ load fn() in advance
         cmp    lr, #16
    movhs   lr, #16
@@ -469,7 +499,13 @@ ARM_FUNC_START ffi_closure_VFP

 .Lclosure_epilogue_vfp:
    add sp, sp, #72
+#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
+   ldr     ip, [sp, #4]
+   ldr     sp, [sp]
+   mov     pc, ip
+#else
    ldmfd   sp, {sp, pc}
+#endif

 .Lretfloat_vfp:
    flds    s0, [sp]
于 2012-11-01T06:43:40.950 回答