3

フラッシュベースのマイクロコントローラーで実行するコードをリンクすることになっている次のリンカースクリプトがあります。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

ありがとう。

4

2 に答える 2

1

リンカスクリプトは、.dataをRAMにリンクし、.dataをFLASHにロードします。これはATコマンドによるものです。

なぜ揮発性データをフラッシュにリンクしたいのですか?データとBssは常にRAMにリンクされている必要があります。リンカスクリプトは非常に正しいです。テキストをリンクし、データをフラッシュに変換するだけです。

マップファイルをご覧ください。必然的にデータ変数にRAMアドレスが割り当てられます。

次に、プログラムローダーコードは、コピー(data_end --data_beg)バイトをdata_beg_srcからdata_begにコピーします。

したがって、配列である最初のデータがSRAMの先頭にコピーされます。

データをフラッシュにリンクする必要がある場合:

 Data :
  {
   *(.data);
  } > flash

リンカは、.dataをフラッシュにリンクしてロードします。しかし、私があなたなら、私はそれをしません。

于 2012-12-08T03:55:38.520 に答える