セクションを使用して特定のアドレスに関数を配置した後、その関数のアドレスを出力し、結果が選択されたセクションアドレス+ 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は常に偶数アドレスを表示します 誰かが助けることができますか?
おかげ
マーティン
あなたの質問と問題とはまったく関係ありませんが、 'printf'を使ってポインタを出力する移植可能な方法は、' '%p" '形式です。引数は 'void * 'でなければなりません。 –