現在、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を追加しましたが、これは正常に機能しているようです:)