Gcc 可以为Cortex-M3构建Libffi吗?
我正在尝试使用GCC为Cortex-M3处理器构建外部函数接口库。根据: -mthumbGcc 可以为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选项直接传递给汇编程序 我尝试过将各种参数传递给汇编程序,但似乎无
为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]