2016-04-07 4 views
0

私はGCC/binutilsツールチェーンを使ってマイクロコントローラ(MSP430シリーズ)のベアメタルコードを書いています。私のリンカースクリプトを使って未使用の割り込みベクタを "forever loop "opcode(開発中、運用中は" SW reset "オペコード)。私はこれが起こるように見えることはできません。GNU LD空のリンカーセクションを埋めよう

は、ここに私のリンカスクリプト(または関連するセクション)です:

MEMORY { 
    SFR    : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ 
    PERIPHERAL_8BIT : ORIGIN = 0x0010, LENGTH = 0x00F0 /* END=0x0100, size 240 */ 
    PERIPHERAL_16BIT : ORIGIN = 0x0100, LENGTH = 0x0100 /* END=0x0200, size 256 */ 
    RAM    : ORIGIN = 0x1C00, LENGTH = 0x0800 /* END=0x23FF, size 2048 */ 
    INFOMEM   : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 as 4 128-byte segments */ 
    INFOA   : ORIGIN = 0x1980, LENGTH = 0x0080 /* END=0x19FF, size 128 */ 
    INFOB   : ORIGIN = 0x1900, LENGTH = 0x0080 /* END=0x197F, size 128 */ 
    INFOC   : ORIGIN = 0x1880, LENGTH = 0x0080 /* END=0x18FF, size 128 */ 
    INFOD   : ORIGIN = 0x1800, LENGTH = 0x0080 /* END=0x187F, size 128 */ 
    FRAM (rxw)  : ORIGIN = 0x4400, LENGTH = 0xBB80 /* END=0xFF7F, size 48000 */ 
    VECT1   : ORIGIN = 0xFF90, LENGTH = 0x0002 
    VECT2   : ORIGIN = 0xFF92, LENGTH = 0x0002 
    VECT3   : ORIGIN = 0xFF94, LENGTH = 0x0002 
    ... snip ... 
    VECT54   : ORIGIN = 0xFFFA, LENGTH = 0x0002 
    VECT55   : ORIGIN = 0xFFFC, LENGTH = 0x0002 
    RESETVEC   : ORIGIN = 0xFFFE, LENGTH = 0x0002 
    BSL    : ORIGIN = 0x1000, LENGTH = 0x0800 
    HIFRAM (rxw)  : ORIGIN = 0x00010000, LENGTH = 0x00003FFF 
} 

SECTIONS 
{ 
    __interrupt_vector_1 : { KEEP (*(__interrupt_vector_1)) } > VECT1 =0x3C00 
    __interrupt_vector_2 : { KEEP (*(__interrupt_vector_2)) } > VECT2 =0x3C00 
    __interrupt_vector_3 : { KEEP (*(__interrupt_vector_3)) } > VECT3 =0x3C00 
    __interrupt_vector_4 : { KEEP (*(__interrupt_vector_4)) } > VECT4 =0x3C00 
    __interrupt_vector_5 : { KEEP (*(__interrupt_vector_5)) } > VECT5 =0x3C00 
    __interrupt_vector_6 : { KEEP (*(__interrupt_vector_6)) } > VECT6 =0x3C00 
    ... snip ... 
    __interrupt_vector_52 : { KEEP (*(__interrupt_vector_52)) KEEP (*(__interrupt_vector_timer0_b0)) } > VECT52 =0x3C00 
    __interrupt_vector_53 : { KEEP (*(__interrupt_vector_53)) KEEP (*(__interrupt_vector_comp_e)) } > VECT53 =0x3C00 
    __interrupt_vector_54 : { KEEP (*(__interrupt_vector_54)) KEEP (*(__interrupt_vector_unmi)) } > VECT54 =0x3C00 
    __interrupt_vector_55 : { KEEP (*(__interrupt_vector_55)) KEEP (*(__interrupt_vector_sysnmi)) } > VECT55 =0x3C00 
    __reset_vector : 
    { 
    KEEP (*(__interrupt_vector_56)) 
    KEEP (*(__interrupt_vector_reset)) 
    KEEP (*(.resetvec)) 
    } > RESETVEC 
... and all the usual stuff, .data, .bss, etc ... 

これがない場合に、すべての切片を作製していないようです(0x3C00は「永遠にジャンプ」オペコードです)入力上の少なくとも1つのシンボル

私は周りを混乱させようとしました。 =。同様のコマンドを使用して入力セクションに何もない場合でもセクションを作成することができますが、これは時には機能しますが、生成されるセクションはPROGBITSタイプでAフラグが設定されていなければなりません。 。私の試みでは、この設定を作成することはできませんでした。

入力セクションに何もないときに、タイプPROGBITSでAフラグが設定された0x3C00でセクションを生成するにはどうすればよいですか?

ご協力いただきありがとうございます。

答えて

0

SHORT(0x3C00)構文を使用できますか?

__interrupt_vector_1 : { SHORT(0x3C00) } > VECT1 

これは、メモリ領域VECT1に割り当てられ__interrupt_vector_1名前セクションに2バイト0x3cの、00を置くために、リンカーに指示します。もはやKEEPの指示が必要ないと思います。セクションの名前は、使用されていない場合でも、必要なものにすることができます。私は通常、このような場合に私のセクションを自分のメモリ領域にマッチさせます。

.vect1 : { SHORT(0x3C00) } >vect1 

セクション名にドットを付けます。

また、あなたのVECT1は次のようになります。

VECT1   (x) : ORIGIN = 0xFF90, LENGTH = 0x0002 

それは実行可能コードだから。

関連する問題