2011-10-20 38 views
3

フラッシュベースのmicrcontrollerで実行するコードをリンクするはずの次のリンカスクリプトがあります。 uCのアドレスは0x0に、RAMは0x40000000になります。私はフラッシュにデータセクションを入れたいが、データセクションへのアクセスがRAMで行われるようにプログラムをリンクする。要点は、コントローラを起動するときに、フラッシュから手動で適切なRAMの場所にコピーします。フラッシュリンカスクリプトのロードと仮想アドレス

int foo[] = {1,2,3,4,5,6}; 

問題は、それが0x40000000からにリンクされていることである

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 

フォームの配列を表し、そしてない:

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 
} 

上に示したように、コードは、次の出力を生成します私が望むように私は、LDマニュアルで説明されているように、リンカースクリプトのAT>フラッシュ部分にフラッシュへのリンクを指定することを期待していました。

arm-elf-ld -T ./lpc2368.ld entry.o main.o -o binary.elf 

ありがとう:

http://sourceware.org/binutils/docs/ld/Output-Section-Attributes.html#Output-Section-Attributes

、ここでは私のldの呼び出しです。

答えて

1

リンカスクリプトLINKS。データをRAMに、LOADSをデータをFLASHに変換します。これはATコマンドによるものです。

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

地図ファイルをご覧ください。それは必然的にデータ変数にRAMアドレスを割り当てていたであろう。

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

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

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

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

リンカがフラッシュに今LINKとLOADの.DATAます。しかし、もし私があなただったら、私はそれをやりません。

+0

で見ることができます適切なRAMオフセット?したがって、ここではリンカは指定されたアドレス(この場合は '__data_beg__')のRAMにデータをコピーしたと仮定していますか?つまり、 '__data_beg_src__'(フラッシュ)を' __data_beg__'(RAM)にコピーしますか? – sherrellbc

0

あなたの.dataの仮想アドレス= 0x40000000から

あなたの.dataの論理アドレス= 0x00000000の

これは、あなたがアクセスはになります意味link` `することにより、コマンド objdump -h file.elf

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    8 .data   00000014 40000000 00000000 00001000 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
関連する問題