私は現在、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 回答を見つけました。非常に長い本ですが、読む価値があります。