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

pxyaymoc  于 2023-08-06  发布在  其他
关注(0)|答案(4)|浏览(108)

我正在尝试使用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汇编程序 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而不成为组装Maven吗?
值得注意的是,当我直接调用arm-bare_newlib_cortex_m3_nommu-eabi-as时,我会得到不同的错误。

cidc1ykv

cidc1ykv1#

我修改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

字符串

ijxebb2r

ijxebb2r2#

我不想这么说,但这是一个移植的努力。可行,不一定要成为汇编Maven,但需要学习一些。从拇指到手臂很容易,thumb2,我得查一下,thumb2的大部分只是拇指的指令。而thumb具有到arm指令的一对一Map,但不是相反。Thumb大多限制您在所有主力指令上使用较低的8个寄存器,有特殊版本或特殊指令使用较高的寄存器。所以你的许多手臂指令会变成不止一个拇指指令。
首先看看是否有一个构建选项可以在不使用汇编程序的情况下构建这个包,或者进入该目录,看看是否可以在makefile中使用C程序而不是汇编程序。我假设使用C有一个严重的性能问题,这就是为什么要从汇编程序开始。理论上Thumb2比arm更有效,但这并不一定意味着从arm到thumb2的直接端口。因此,有了一些经验,您可能可以将端口交给thumb2并保持一些性能。
编辑:
下载了相关文件。前面的define意味着它同时知道thumb和armv7m。这就是你把stm改成push的方法吗?

bybem2ql

bybem2ql3#

汇编程序告诉你的是事实-- ARM汇编代码不能在像M3这样的只有Thumb-2的处理器上成功地汇编。汇编程序无法将ARM指令助记符Map到对Cortex-M3有意义的操作码。您需要将程序集文件移植到Thumb-2程序集代码才能使其正常工作。根据原始汇编代码的功能,您可能会幸运地移植到C,但这可能会使您的性能受到重大影响。

2uluyalo

2uluyalo4#

在gcc CFLAGS中添加“-Wa,-mimplicit-it=thumb”,以避免“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]

字符串

相关问题