11

私は 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 に位置するユーザー アプリケーションをプログラムします。ボードを再起動すると、ブートローダーは実行されますが、ユーザー アプリにジャンプしません。メモリをチェックしたところ、両方のプログラム (ブートローダー + ユーザー アプリ) が正しく、適切な場所にあるようです。

私はここに何かが欠けていると確信しています.私が見なければならない低レベルのコードはありますか? 私はオンラインでドキュメントのトーンを読みました.私が見つけた例から、それらは私と同じ方法でユーザーコードにジャンプしています...助けてくれてありがとう.

4

2 に答える 2

8

CortexM3はThumbモードでのみ実行できます。したがって、常ににジャンプする必要がありますaddress +1。そうしないと、障害が発生します。

ちょうど試して:

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

于 2012-10-03T23:33:40.213 に答える
4

NXP サイトの AN10866 ドキュメントをお読みください。PC とスタック ポインターをロードしてから、リセット割り込みにジャンプします。

__asm void boot_jump( uint32_t address ){
   LDR SP, [R0]     ;Load new stack pointer address
   LDR PC, [R0, #4] ;Load new program counter address
}

void execute_user_code(void)
{
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */
    SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;

    boot_jump(USER_FLASH_START);
}
于 2013-05-22T07:11:51.067 に答える