0

現在、gcc-arm-embeddedを使用してmbedプロジェクトをオフラインでコンパイルしようとしていますが、このプログラムはブートローダーで使用することを目的としているため、最終的に0x10000から実行する必要があるため、開始アドレスを変更したいと思います。プロジェクトをGCC-ARM-EMBEDDEDとしてエクスポートし、gccでプロジェクトをビルドできます。ただし、開始アドレスを0x10000に指定する方法がわかりません。LPC1768.ldスクリプトを変更して、FLASHのORIGINを0x10000に変更しようとしましたが、何も実行されていないようです。

MEMORY
{
  FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 0x70000
  RAM (rwx) : ORIGIN = 0x100000C8, LENGTH = 0x7F38

  USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K
  ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K
}

プログラムの開始アドレスを変更するのに役立つMakefileまたは他の場所にオプションがありますか?これにより、ブートローダーからアドレス0x10000にジャンプしたときに正しく実行できますか?

編集:

いくつかの回答のおかげで、私は何を達成する必要があるかを理解していると思いますが、何らかの理由でそれを機能させることができません。Mbedはstartup_LPC17xx.sファイルをエクスポートしないので、CMSISのファイルを使用しようとしましたが、うまくいきませんでした。プロセスは次のとおりなので、実際にスタートアップコードを変更する必要があるかどうか疑問に思っています。

  • ブートローダーは0x0000で実行されます
  • ブートローダーはいくつかのチェックを行い、最終的には0x10000にあるユーザーアプリを実行します。ブートローダーは、0x10000にジャンプする前に、実際にベクトルテーブルを移動します。このユーザーアプリは、私がgccでビルドしようとしているものであり、電源投入時に実行されず、ブートローダーが起動した後にのみ実行されます。それが明確かどうかはわかりませんが、リンカースクリプトを変更するだけで機能すると思いますが、そうではありません。

このセクションアドレスを0x10000に変更したリンカースクリプトの詳細:

セクション{

.text : 
{
    *startup_LPC17xx.o 
    KEEP(*(.isr_vector))
    *(.text*)

    KEEP(*(.init))
    KEEP(*(.fini))

    /* .ctors */
    *crtbegin.o(.ctors)
    *crtbegin?.o(.ctors)
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
    *(SORT(.ctors.*))
    *(.ctors)

    /* .dtors */
    *crtbegin.o(.dtors)
    *crtbegin?.o(.dtors)
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
    *(SORT(.dtors.*))
    *(.dtors)

    *(.rodata*)

    KEEP(*(.eh_frame*))
} > FLASH

.ARM.extab : etc..

EDIT2:スクリプトに* startup_LPC17xx.oを追加しましたが、これは正常に機能しているようです:)

4

2 に答える 2

1

リンカファイルで、0x10000から始まるセクションを指定します。次に、crt0または同様のスタートアップコードで、リセットエントリハンドラをこのセクションにあるものとして定義して、リンカがそこに配置するようにする必要があります。.sectionこれは、または#pragmaまたは同様のメカニズムを介して行うことができます。リンカが生成したマップファイルを調べて、リセットハンドラが0x10000に配置されていることを確認できます。

于 2012-10-08T23:33:51.503 に答える
0

LPC1768.ldスクリプトを変更して、FLASHのORIGINを0x10000に変更しようとしましたが、何も実行されていないようです。

正しいリンカースクリプトを使用しているかどうか、リンカー設定を確認してください。ORIGINとサイズの変更はここで機能します(arm-none-eabi-gccを使用したLPC1768)。ベクトルテーブルが間違った位置にあるため、結果のプログラムはベアメタルで実行されなくなることに注意してください。起動するには、ブートローダーが適切に配置されている必要があります。

ブートローダーはジャンプしてはならず0x10000、テーブルから0x10004PCにリセットベクトルをロードする必要があることに注意してください。0x10000直前からMSP(メインスタックポインタ)をロードしたときのボーナスポイント。

于 2012-10-09T23:07:35.927 に答える