ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

アドレス配置__attribute__について

以前も同じような記事を書いたのだがもうちょいかいつまんで書いていくことにした。


i.MX RT1050のコードの一部の紹介

#if defined(__CC_ARM) || defined(__GNUC__)
    __attribute__((section(".boot_hdr.ivt")))
#elif defined(__ICCARM__)
#pragma location=".boot_hdr.ivt"
#endif
/************************************* 
 *  IVT Data 
 *************************************/
const ivt image_vector_table = {
  IVT_HEADER,                         /* IVT Header */
  IMAGE_ENTRY_ADDRESS,                /* Image Entry Function */
  IVT_RSVD,                           /* Reserved = 0 */
  (uint32_t)DCD_ADDRESS,              /* Address where DCD information is stored */
  (uint32_t)BOOT_DATA_ADDRESS,        /* Address where BOOT Data Structure is stored */
  (uint32_t)&image_vector_table,      /* Pointer to IVT Self (absolute address */
  (uint32_t)CSF_ADDRESS,              /* Address where CSF file is stored */
  IVT_RSVD                            /* Reserved = 0 */
};


まずARMコンパイラGNUかIARコンパイラの分岐マクロで構成される
CC_ARMってのはARMのコンパイラなんだけどGNU互換命令が使えるのでANDマクロである。

んでもって__attribute__((section(".boot_hdr.ivt")))ってのが配置命令

__attribute__((section("リンカー変数名"))) char buffer[1024] ;

的な感じで使う

.boot_hdr.ivtってのはリンカースクリプト(ld拡張子のファイル)に定義されてる変数のこと
f:id:gsmcustomeffects:20180725234402p:plain

んでもってこの記述をするとどこに配置されるか見ていく。
まずこいつをくくってるのがBOARD_FLASHっていうSECTIONになる
f:id:gsmcustomeffects:20180725234501p:plain

これはリンカーの上のほうで定義されてると思う
f:id:gsmcustomeffects:20180725234629p:plain

んでもって0x1000にカウンタがいるのでimage_vector_tableっていう構造体は0x60000000+0x1000に配置されそうだなってことがわかる。

コンパイル後の.mapファイルを見るとそのようになっている
f:id:gsmcustomeffects:20180726002037p:plain

pragmaに関してはIARなので趣味マンはGNUだと思うので知らなくてもいいけど

https://www.iarsys.co.jp/customer/Faqs/faqListView/10810338

に書いてある。