私は mbed の LPC 1768 ボード (cortex M3 cpu を搭載) を使用しており、ここで何かを達成しようとしています。主に SD カードからユーザー アプリケーションをアップグレードしています。最初にブートローダー/ナノカーネルの 2 つのプログラムを作成しています。ユーザーアプリ (最初は helloworld で十分です):
- アドレス 0x00 のブートローダー/ナノカーネルが実行され、いくつかのチェックが行われ、最終的に SD カード上のバイナリ ファイルが取得されます。
- ブートローダー/ナノカーネルは、このバイナリをアドレス 0x9000 にコピーします (後で変更する必要があるかもしれませんが、このスペースはブートローダー/ナノカーネルによって使用されないため、問題ありません)。
- ブートローダーは 0x9000 + 4 でユーザー アプリケーションにジャンプします。
Sd カードは非常に簡単に解決できます。ジャンピング部分に問題があります。これがジャンプ関数のコードです。
void run(void) {
void (*user_code_entry)(void);
unsigned *p;
SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
// Load contents of second word of user flash - the reset handler address
// in the applications vector table
p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
user_code_entry = (void (*)(void))p;
// Jump to user application
user_code_entry();
}
そこで、開始アドレスを 0x9000 に変更してユーザー アプリケーションをコンパイルしました (私は Keil uvision4 を使用しています)。(flashmagictool を使用して) ボードをプログラムし、手動で (まだ flashmagictool を使用して) 0x9004 (0x9000 + 4) にジャンプすると、ユーザー アプリケーションが実行されるので、コンパイルが正常に機能したため、ユーザー アプリは 0x9000 で実行できると思います。
しかし、ブートローダー/ナノカーネルを実行すると、これはユーザーアプリケーションにジャンプせず、残念ながらデバッグできないため、何が起こっているのかわかりません...また、SDコピーを使用しないようにしましたそのため、最初に基本的に 0x9004 へのジャンプだけでブートローダーをプログラムします。次に、0x9000 に位置するユーザー アプリケーションをプログラムします。ボードを再起動すると、ブートローダーは実行されますが、ユーザー アプリにジャンプしません。メモリをチェックしたところ、両方のプログラム (ブートローダー + ユーザー アプリ) が正しく、適切な場所にあるようです。
私はここに何かが欠けていると確信しています.私が見なければならない低レベルのコードはありますか? 私はオンラインでドキュメントのトーンを読みました.私が見つけた例から、それらは私と同じ方法でユーザーコードにジャンプしています...助けてくれてありがとう.