2011-01-16 8 views
2

Я пытаюсь построить библиотеку интерфейса внешней функции для процессора Cortex-M3 с использованием GCC. По http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html:Может ли Libffi построить для Cortex-M3?

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

Я попытался прохождения различных различных аргументов в ассемблер и не могу показаться, чтобы выяснить это. Типичный выход следующим образом:

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}'
...

Могу ли я использовать libffi на Cortex-M3, не становясь экспертом в сборе?

Возможно, стоит отметить, что когда я вызываю arm-bare_newlib_cortex_m3_nommu-eabi-as, я получаю разные ошибки.

ответ

1

Ненавижу говорить об этом, но это усилия по переносу. Возможность, не обязательно быть экспертом по ассемблеру, но нужно будет изучить некоторые. Переход от большого пальца к руке легко, thumb2, мне нужно было бы это посмотреть, большая часть большого пальца2 - это просто инструкции большого пальца. и большой палец имеет от одного до одного сопоставление с командами рук, но не наоборот. Thumb в основном ограничивает вас в нижних 8 регистрах во всех инструкциях рабочей лошадки, со специальными версиями или специальными инструкциями по использованию верхних регистров. Поэтому многие из ваших инструкций по рукам превратятся в более чем одну команду большого пальца.

Первоначально вы видите, есть ли возможность сборки для сборки этого пакета без использования ассемблера или перейти в этот каталог и посмотреть, есть ли что-то, что вы можете сделать в make-файле для использования программы на C вместо ассемблера. Я предполагаю, что существует серьезная проблема с эффективностью использования C, поэтому для начала есть ассемблер. Thumb2 в теории более эффективен, чем рука, но это не обязательно означает прямой порт от руки к thumb2. Таким образом, с некоторым опытом вы можете переносить порт на thumb2 и поддерживать некоторую производительность.

EDIT:

Загрузили файл в вопросе. Определяющий материал спереди подразумевает, что он знает как большой, так и armv7m. это то, как вы добираетесь до того места, где вы меняете stm, чтобы нажимать?

+0

Кто-то на libffi-обсуждении указал, что есть инструкция .arm, которая _allways_ пытается поместить ее в режим руки, поэтому она, безусловно, не может быть использована как есть. Благодаря! – Neil

1

Ассемблер говорит вам правду - код сборки ARM не может быть собран, чтобы успешно работать на процессоре Thumb-2, таком как M3. Ассемблеру нет способа сопоставить мнемонику команд ARM с кодами операций, которые будут иметь смысл для Cortex-M3. Вам нужно будет портировать файлы сборки на ассемблерный код Thumb-2, чтобы заставить все работать. В зависимости от того, что делает исходный код сборки, вам может повезти, и вы сможете переносить на C вместо этого, но это может стоить вам серьезного удара по производительности.

+0

Я просто заменил stmfd зр! { r0-r3, fp, lr} с push {r0-r3, fp, lr} и по-прежнему получают ту же ошибку. Справочное руководство по архитектуре ARMv7-M говорит, что это справедливо для всех версий набора команд Thumb. – Neil

+0

Нет, Cortex M3 не имеет регистра FP для всех проектов, которые мне известны. Сопроцессорные инструкции должны быть в программном обеспечении, которое будет иметь значение REAL, если код использует их много ... –

+0

FP - это просто псевдоним для R11 здесь. –

2

Я изменяю sysV.S как follolwing, ошибка вызвана директивой «.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 
0

Добавить "-Wa, -mimplicit-он = большой палец" в ССАГПЗ CFLAGS, чтобы избежать "большой палец условная инструкция должна быть в 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]