6

私は現在、ARM Cortex M3 のブートローダーに取り組んでいます。

Cアセンブリの 2 つの関数がありますが、アセンブリ関数を呼び出そうとすると、プログラムがハングし、何らかの障害が発生します。

機能は次のとおりです。

子:

extern void asmJump(void* Address) __attribute__((noreturn));

void load(void* Address)
{
    asmJump(Address);
}

組み立て:

.section .text

.global asmJump

asmJump:                   @ Accepts the address of the Vector Table
                           @ as its first parameter (passed in r0)

    ldr r2, [r0]           @ Move the stack pointer addr. to a temp register.
    ldr r3, [r0, #4]       @ Move the reset vector addr. to a temp register.

    mov sp, r2             @ Set the stack pointer

    bx  r3                 @ Jump to the reset vector

そして私の問題はこれです:

このコードはシリアル経由で "Hello" を出力してから を呼び出しますload。ロードされたコードは「Good Bye」を出力し、チップをリセットします。

load呼び出しの部分をゆっくりと進むと、asmJumpすべてが完全に機能します。ただし、コードを実行すると、コードで「メモリ障害」が発生します。Hard Faultなんらかの方法で (4 または 5 秒後に一時停止すると、Hard Fault ハンドラーの無限 while ループが実行されている)原因となるため、メモリ障害であることはわかっています。

以前にこの問題を経験した人はいますか? もしよろしければ、解決方法を教えていただけないでしょうか。

ご覧のとおり、関数属性を使用して問題を修正しようとしましたが、まだ解決策にたどり着いていません。そもそも問題が何であるかを誰かが理解するのを手伝ってくれることを願っています。

編集:

@JoeHass の回答に感謝し、@MartinRosenau のコメントに感謝します。その後、このラベルが必要な理由について非常に完全な説明があったこの SO 回答を見つけました。非常に長い本ですが、読む価値があります。

4

3 に答える 3

1

あなたはデバッガーが動作していると述べたので、それを使用してください!

フォルト ステータス レジスタを調べて、フォルトの原因を特定します。たぶんasmJumpクラッシュしているのではなく、呼び出しているコードです。

于 2013-09-17T10:32:03.013 に答える
0

それがあなたのすべてのコードである場合.. SPの変更がセグメントエラーまたはそのようなものを呼び出したと思います。SP を変更する前に保存し、使用後に復元する必要があります。

ldr r6, =registerbackup
str sp, [r6]
#your code
...
ldr r6, =registerbackup
ldr sp, [r6]
于 2013-09-17T08:51:59.973 に答える