3

GCCを使用してCortex-M3プロセッサ用の外部関数インターフェイスライブラリを構築しようとしています。http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.htmlによると:

-mthumbThumb
命令セットのコードを生成します。デフォルトでは、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のみのプロセッサでARM命令を使用しようとしました-`stmfd sp!、{r0-r3、fp、lr} '
..。。

アセンブリのエキスパートになることなく、Cortex-M3でlibffiを使用できますか?

arm-bare_newlib_cortex_m3_nommu-eabi-を直接呼び出すと、さまざまなエラーが発生することに注意してください。

4

4 に答える 4

2

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
于 2012-11-01T02:55:04.617 に答える
1

私はそれを言うのは嫌ですが、それは移植の努力です。実行可能であり、必ずしもアセンブラーの専門家である必要はありませんが、いくつかを学ぶ必要があります。親指から腕への移動は簡単です、thumb2、私はそれを調べなければならないでしょう、thumb2の多くは単なる親指の指示です。また、thumbにはarm命令への1対1のマッピングがありますが、その逆はありません。Thumbは、ほとんどの場合、すべての主力命令の下位8レジスタに制限されており、上位レジスタを使用するための特別なバージョンまたは特別な命令があります。腕の指示の多くは、複数の親指の指示に変わります。

最初に、アセンブラを使用せずにこのパッケージをビルドするビルドオプションがあるかどうかを確認するか、そのディレクトリに移動して、アセンブラの代わりにCプログラムを使用するためにmakefileで実行できることがあるかどうかを確認します。Cを使用することには深刻なパフォーマンスの問題があると思います。そのため、最初にアセンブラーがあります。理論的にはThumb2はarmよりも効率的ですが、それは必ずしもarmからthumb2への直接ポートを意味するわけではありません。したがって、ある程度の経験があれば、thumb2にポートを渡して、パフォーマンスを維持できる場合があります。

編集:

問題のファイルをダウンロードしました。前もって定義するものは、thumbとarmv7mの両方を認識していることを意味します。それは、プッシュするためにstmを変更していた場所にどのように到達しているのですか?

于 2011-02-07T18:32:35.070 に答える
0

アセンブラは真実を語っています-ARMアセンブリコードは、M3のようなThumb-2のみのプロセッサで正常に動作するようにアセンブルすることはできません。アセンブラがARM命令ニーモニックをCortex-M3にとって意味のあるオペコードにマップする方法はありません。動作させるには、アセンブリファイルをThumb-2アセンブリコードに移植する必要があります。元のアセンブリコードの機能によっては、運が良ければ代わりにCに移植できる場合がありますが、パフォーマンスが大幅に低下する可能性があります。

于 2011-01-16T05:08:52.743 に答える
0

「-Wa、-mimplicit-it =thumb」をgccCFLAGSに追加して、「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]
于 2012-11-01T06:43:40.950 に答える