フラッシュベースのマイクロコントローラーで実行するコードをリンクすることになっている次のリンカースクリプトがあります。uCには、アドレス0x0にフラッシュがあり、0x40000000にRAMがあります。データセクションをフラッシュに入れたいのですが、データセクションへのアクセスがRAMで行われるようにプログラムをリンクします。重要なのは、コントローラーの起動時に、フラッシュから適切なRAMの場所に手動でコピーすることです。
MEMORY
{
flash : ORIGIN = 0x00000000, LENGTH = 512K
ram : ORIGIN = 0x40000000, LENGTH = 32K
usbram : ORIGIN = 0x7FD00000, LENGTH = 8K
ethram : ORIGIN = 0x7FE00000, LENGTH = 16K
}
SECTIONS
{
.text : { *(.text) } >flash
__end_of_text__ = .;
.data :
{
__data_beg__ = .;
__data_beg_src__ = __end_of_text__;
*(.data)
__data_end__ = .;
} >ram AT>flash
.bss :
{
__bss_beg__ = .;
*(.bss)
} >ram
}
上記のコードは、次の出力を生成します。
40000000 <__data_beg__>:
40000000: 00000001 andeq r0, r0, r1
40000004: 00000002 andeq r0, r0, r2
40000008: 00000003 andeq r0, r0, r3
4000000c: 00000004 andeq r0, r0, r4
40000010: 00000005 andeq r0, r0, r5
40000014: 00000006 andeq r0, r0, r6
これは、フォームの配列を表します
int foo[] = {1,2,3,4,5,6};
問題は、それが0x40000000にリンクされており、私が望んでいたフラッシュ領域ではないことです。LDマニュアルで説明されているように、リンカースクリプトのAT> flash部分で、フラッシュへのリンクを指定することを期待していました。
http://sourceware.org/binutils/docs/ld/Output-Section-Attributes.html#Output-Section-Attributes
そして、これが私のld呼び出しです:
arm-elf-ld -T ./lpc2368.ld entry.o main.o -o binary.elf
ありがとう。