Gcc 可以为Cortex-M3构建Libffi吗?

Gcc 可以为Cortex-M3构建Libffi吗?,gcc,assembly,arm,cortex-m3,libffi,Gcc,Assembly,Arm,Cortex M3,Libffi,我正在尝试使用GCC为Cortex-M3处理器构建外部函数接口库。根据: -mthumb 为Thumb指令集生成代码。默认情况下使用32位ARM指令集。此选项根据-mcpu=name和-march=name选项自动启用16位Thumb-1或混合16/32位Thumb-2指令。此选项不会传递给汇编程序。如果要强制将汇编程序文件解释为Thumb代码,请向源代码中添加一个“.Thumb”指令,或者通过在-Wa前面加上前缀将-mthumb选项直接传递给汇编程序 我尝试过将各种参数传递给汇编程序,但似乎无

我正在尝试使用GCC为Cortex-M3处理器构建外部函数接口库。根据:

-mthumb
为Thumb指令集生成代码。默认情况下使用32位ARM指令集。此选项根据-mcpu=name和-march=name选项自动启用16位Thumb-1或混合16/32位Thumb-2指令。此选项不会传递给汇编程序。如果要强制将汇编程序文件解释为Thumb代码,请向源代码中添加一个“.Thumb”指令,或者通过在-Wa前面加上前缀将-mthumb选项直接传递给汇编程序

我尝试过将各种参数传递给汇编程序,但似乎无法理解。典型输出如下所示:

生成文件:../source/ffi/sysv.S
调用:GCC汇编程序
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处理器上使用ARM指令--`stmfd sp!,{r0-r3,fp,lr}'

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


可能值得注意的是,当我直接调用arm-bare\u newlib\u cortex\u m3\u nommu-eabi-as时,我会得到不同的错误。

汇编程序告诉你一个事实——arm汇编代码无法在m3这样的纯Thumb-2处理器上成功运行。汇编程序无法将ARM指令助记符映射到对Cortex-M3有意义的操作码中。您需要将程序集文件移植到Thumb-2程序集代码,以使其正常工作。根据原始汇编代码的功能,您可能会幸运地将其移植到C,但这可能会导致性能下降。

我不想这么说,但这是一项移植工作。可行,不一定是一个汇编专家,但需要学习一些。从拇指到手臂很容易,拇指2,我必须向上看,拇指2的大部分只是拇指指令。thumb有一个到arm指令的一对一映射,但不是相反。Thumb主要将您限制在所有主要指令上的下8个寄存器,并使用特殊版本或特殊指令来使用上寄存器。你的很多手臂指令都会变成不止一个拇指指令

首先,看看是否有一个构建选项来构建这个包而不使用汇编程序,或者进入那个目录,看看在makefile中是否可以使用C程序而不是汇编程序。我假设使用C有一个严重的性能问题,这就是为什么要从汇编程序开始。理论上,Thumb2比arm效率更高,但这并不一定意味着从arm到Thumb2的直接端口。因此,有了一些经验,您可以将端口切换到thumb2并保持一定的性能

编辑:


下载了有问题的文件。前面的define stuff意味着它同时知道thumb和armv7m。这就是将stm更改为push的方法吗?

我将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
将“-Wa,-mimplicit it=thumb”添加到gcc CFLAGS中,以避免“thumb条件指令应在it块中”错误


我刚刚更换了stmfd sp!,{r0-r3,fp,lr}和push{r0-r3,fp,lr}仍然得到相同的错误。ARMv7-M架构参考手册说,这对Thumb指令集的所有版本都有效。不,Cortex M3在我所知道的所有设计中都没有FP寄存器。协处理器指令必须在软件中,如果代码经常使用它们,这将对性能造成真正的影响…FP只是R11的别名。thumb只能从pop上的r0-r7 plus lr或r0-r7 plus pc获取。thumb2最多允许r12,您需要指定thumb2。在文件中尝试.cpu cortex-m3,而不是.thumb。在作为分支目的地(当然是全局)的每个标签之前放置.thumb\u func。这两件事可能会让你有很长的路要走。libffi讨论中有人指出,.arm指令总是试图将其置于arm模式,因此它肯定不能按原样使用。谢谢
--- 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]