2011-01-16 7 views
2

Ich versuche, die Fremdfunktionsschnittstellenbibliothek für einen Cortex-M3-Prozessor mit GCC zu erstellen. Nach http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html:Kann Libffi für Cortex-M3 gebaut werden?

-mthumb
Generate code for the Thumb instruction set. The default is to use the 32-bit ARM instruction set. This option automatically enables either 16-bit Thumb-1 or mixed 16/32-bit Thumb-2 instructions based on the -mcpu=name and -march=name options. This option is not passed to the assembler. If you want to force assembler files to be interpreted as Thumb code, either add a `.thumb' directive to the source or pass the -mthumb option directly to the assembler by prefixing it with -Wa.

ich verschiedene verschiedene Argumente an die Assembler geben habe versucht, und kann nicht scheinen, um es herauszufinden. Eine typische Ausgabe wie folgt:

Building file: ../source/ffi/sysv.S
Invoking: 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: Assembler messages:
../source/ffi/sysv.S:145: Error: selected processor does not support ARM opcodes
../source/ffi/sysv.S:147: Error: attempt to use an ARM instruction on a Thumb-only processor -- `stmfd sp!,{r0-r3,fp,lr}'
...

Kann ich libffi auf Cortex-M3 verwenden, ohne eine Montage Experte zu werden?

Es ist vielleicht erwähnenswert, dass, wenn ich arm-bare_newlib_cortex_m3_nommu-eabi aufrufen-als direkt bekomme ich verschiedene Fehler.

Antwort

1

Ich hasse es zu sagen, aber es ist eine Portierung Anstrengung. Doable, muss nicht unbedingt Assembler-Experte sein, muss aber einiges lernen. Von Daumen zu Arm zu gehen ist einfach, Daumen2, ich müsste das nachsehen, ein großer Teil von Daumen2 ist nur eine Daumenanweisung. und der Daumen hat eine Eins-zu-Eins-Zuordnung, um Anweisungen zu bewaffnen, aber nicht umgekehrt. Thumb beschränkt Sie meistens auf die unteren 8 Register in allen Arbeitsanweisungen, mit speziellen Versionen oder speziellen Anweisungen, um die oberen Register zu verwenden. So viele Anweisungen Ihres Arms werden zu mehr als einer Daumenanweisung.

Zuerst sehen, ob es eine Build-Option gibt, um dieses Paket ohne Assembler zu erstellen oder gehen Sie in dieses Verzeichnis und sehen, ob Sie etwas im Makefile tun können, um ein C-Programm anstelle von Assembler zu verwenden. Ich nehme an, dass es ein ernsthaftes Leistungsproblem bei der Verwendung von C gibt, weshalb es Assembler zum Starten gibt. Thumb2 in der Theorie ist effizienter als Arm, aber das bedeutet nicht unbedingt eine direkte Verbindung von Arm zu Daumen2. Mit etwas Erfahrung können Sie Port 2 an Hand geben und etwas Leistung behalten.

EDIT:

Die betreffende Datei heruntergeladen. Das Definieren von Sachen vorne bedeutet, dass es sowohl Daumen als auch Armv7m kennt. Ist das, wie kommst du dahin, wo du Stm änderst?

+0

Jemand auf libffi-discuss wies darauf hin, dass es eine .arm-Anweisung gibt, die _always_ versucht, sie in den Arm-Modus zu versetzen, so dass sie sicher nicht so verwendet werden kann, wie sie ist. Vielen Dank! – Neil

1

Der Assembler sagt Ihnen die Wahrheit - ARM-Assemblercode kann nicht zusammengebaut werden, um auf einem Thumb-2-only-Prozessor wie dem M3 zu funktionieren. Es gibt keine Möglichkeit für den Assembler, die ARM-Befehls-Mnemonics in Opcodes abzubilden, die für einen Cortex-M3 sinnvoll sind. Sie müssen die Assemblydateien in Thumb-2-Assemblycode portieren, damit die Dinge funktionieren. Je nachdem, was der ursprüngliche Assembly-Code tut, könnten Sie Glück haben und in der Lage sein, stattdessen nach C zu portieren, aber das kostet Sie möglicherweise einen großen Leistungseinbruch.

+0

I stmfd sp gerade ersetzt!, { r0-r3, fp, lr} mit push {r0-r3, fp, lr} und bekomme immer noch den gleichen Fehler. Das ARMv7-M Architecture Reference Manual besagt, dass dies für alle Versionen des Thumb-Befehlssatzes gilt. – Neil

+0

Nein, Cortex M3 hat kein FP-Register für alle Designs, die mir bekannt sind. Coprozessoranweisungen müssen in der Software sein, das ist ein WIRKLICHER Leistungshit, wenn der Code sie viel verwendet ... –

+0

FP ist nur ein Alias ​​für R11 hier. –

2

Ich modifiziere die sysV.S wie folgt, der Fehler wird durch die ".arm" -Richtlinie verursacht, wenn Cortex-m3 verwendet wird, sollte es auskommentieren.

#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 
0

Add "-Wa, -mimplicit-it = Daumen" zu den gcc CFLAGS zu vermeiden "Daumen bedingte Anweisung sollte in der IT-Block" Fehler

--- 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]