2017-01-09 34 views
0

セクションを使用して特定のアドレスに関数を配置した後、その関数のアドレスを出力し、結果が選択されたセクションアドレス+ 1になります。 これは、GCCはCortex M3でアラインメントされていない関数アドレスを生成します

void __attribute__((section (".my_fct_address"))) Fct_Ptr_Test (void) 
{ 
... 
} 

とLD-ファイル内

void (*fct_ptr) (void); 
fct_ptr = Fct_Ptr_Test; 
printf ("0X%X\r\n", (uint32_t)(fct_ptr)); 
fct_ptr(); 

.my_fct_address 0x800F000 : 
{ 
    KEEP(*(.my_fct_address)) /* keep my variable even if not referenced */ 
} > FLASH 

上記のprintf文は、私が

fct_ptr = 0x800F000; 

システムがクラッシュを設定した場合0x800F001とFct_Ptr_Testが正しく

と呼ばれる出力します。 設定した場合

fct_ptr = 0x800F001; 

すべてが問題ありません。 Fct_Ptr_Testを独自のセクションに配置しないと、リンカはどこにでも置くことができます。つまり、奇数アドレスも取得します。 今私は、0x800F001が32ビットコントローラ(ARM cortex M3)上で適切なアドレスになり、0x800F000に格納されているものがどれくらいかと思います。 さらに奇妙なことに、map-fileは常に偶数アドレスを表示します 誰かが助けることができますか?

おかげ

マーティン

+0

あなたの質問と問題とはまったく関係ありませんが、 'printf'を使ってポインタを出力する移植可能な方法は、' '%p" '形式です。引数は 'void * 'でなければなりません。 –

答えて

2

リンカ(docs参照)インターワーキングを容易にするために1にThumb関数の最下位ビットをセットします。おそらくあなたの場合ですか?

+0

こんにちはyugr、そうだと思います。リンクにもありがとうございました。マーティン –

+0

それは間違いなくケースです! –

+1

親指のマシン(cortex-m3)とのインターワーキングがないので、bxとpopのような命令は、サムベースのブランチまたはリターンアドレスに対してlsbitを設定することを期待しています。 BXの取扱説明書を参照してください。 –

関連する問題