2012-10-03 23 views
9

mbedのLPC 1768ボード(皮質M3 CPU付き)を使用していますが、ここで何かを達成しようとしていますが、主にSDカードからユーザアプリケーションをアップグレードしています。ブートローダ/ナノカーネル、およびユーザーのアプリ(スタートのために行いますhelloworldの):0x00のアドレスの実行時Cortex M3用ブートローダ

  • ブートローダ/ナノカーネル、それはいくつかのチェックを行い、最終的にはSD上のバイナリファイルをつかむだろうカード
  • Bootloader/nano-kernelはこのバイナリをアドレス0x9000にコピーします(後で変更する必要があるかもしれませんが、このスペースはブートローダ/ nanoカーネルでは使用されていません)ので、
  • ブートローダは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(); 

}

だから私は(私はKeil社のuvision4を使用しています)、0x9000というの開始アドレスを変更するユーザー・アプリケーションをコンパイルしています。 (flashmagictoolを使って)私の掲示板をプログラムしてから手動で(flashmagictoolを使って)0x9004(0x9000 + 4)にジャンプすると、ユーザーアプリケーションが実行されるので、コンパイルがうまくいき、0x9000で実行できます。

しかし、私がブートローダ/ナノカーネルを実行した場合、このアプリケーションはユーザアプリケーションにジャンプせず、残念ながらデバッグできないため、何が起こっているのか分かりません。 SDコピー部分を使用するので、ブートローダーを最初にプログラミングして、基本的に0x9004にジャンプします。私は0x9000に座るユーザーアプリケーションをプログラミングします。ボードを再起動すると、ブートローダは動作しますが、user-appにジャンプしません。私はメモリをチェックしており、両方のプログラム(bootloader + user-app)が正しい場所にあるようです。

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

+0

これはPC上でも同様に動作しますが、物理アドレスではなく仮想アドレスで動作するようにしてください。コードをKeilに移動 – Ulterior

+1

Cortex M3にはMMUがないため、仮想アドレスはありません。 –

答えて

8

Cortex M3はThumbモードでのみ実行できます。したがって、常にaddress +1にジャンプする必要があります。そうしないと、フォールトが生成されます。

ただ、試してみてください。

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

+0

これは信じられません!どうもありがとうTurbo J :) – batmat

+3

これはおそらく働いていたが、それは意味をなさないと分かっている。コンパイラはThumb命令を生成する必要があります。私はあなたがそこでやったのと全く同じことをします(+1はない)、それは私のために働くようです。 'arm-none-eabi-gcc'コンパイラに'親指 'フラグが設定されていますか? – nonsensickle

+0

ありがとう!これはM4でも私のために働いた。デバッガはすべて正常にコンパイルされましたが、IARデバッガの警告を除いて、デバッガはすべてのコードを実行しました。コードをステップ実行しながらジャンプする際に発生する警告です。「XPSRのTビットは0ですが、1にする必要があります。 。" – tniles09

3

だけNXPサイト上AN10866ドキュメントをお読みください。

__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); 
} 
+0

また、http://infocenter.arm.com/help/topic/com.arm.doc.dui0056d/DUI0056.pdf(4-6ページおよび4-7ページ)の「インラインアセンブラの相違点あなたはPCに値を保存することはできません。また、 'bx'命令はサポートされていませんが、インラインasmで現在使用しているコードを持っています。 – nonsensickle

+0

私の前のコメントは@John Sinclairが使用したようなインラインアセンブリを指しています。これらは別々のアセンブリコードファイルで使用するのは安全ですが、インラインアセンブリで同じことをしているバージョンがありましたが、それもうまくいきましたので、ARMの推奨事項をどうすればよいかはわかりません。 – nonsensickle

関連する問題