同じ名前のセクションを別の領域に分割して配置した際の、配置アドレスを取得する

Technical Note 181232J

Targets:
ARM

Component:

Updated:
2/8/2019 7:45 AM

はじめに

本テクニカルノートでは、同じ名前のセクションを別の領域に分割して配置した際の、配置アドレスを取得する方法について説明します。

 

解説

同じセクション名の.oファイルを別のregionに配置すると、アセンブラ/Cソースで配置したアドレスやサイズを知ることができなくなります。

place in ROM1_region {ro section MYSEG_init object data1.o};
place in ROM2_region {ro section MYSEG_init object data2.o};

 

---Cソース---

#pragma section =”MYSEG_init”
char *rom1_start = __section_begin(“MYSEG_init”);

 

この場合、いったん下記のように、別々のブロックを定義してから、それぞれのブロックの配置アドレス、サイズを求めてください。

define block ROM1_block {ro section MYSEG_init object data1.o};
define block ROM2_block {ro section MYSEG_init object data2.o};


“ROM1”:place in ROM1_region {block ROM1_block};
“ROM2”:place in ROM2_region {block ROM2_block};

 

++++テストコード

#include <intrinsics.h>
#include <stddef.h>
#include <stdio.h>

#pragma section = “ROM1_block”
#pragma section = “ROM2_block”

int main()
{
    size_t rom1_size = __section_size("ROM1_block");
char *rom1_start = __section_begin("ROM1_block");
   char *rom1_end   = __section_end("ROM1_block");
    size_t rom2_size = __section_size("ROM2_block");
    char *rom2_start = __section_begin("ROM2_block");
    char *rom2_end   = __section_end("ROM2_block");

printf("ROM1: 0x%08x - 0x%08x (%zu)\n",  rom1_start, rom1_end, rom1_size);
printf("ROM2: 0x%08x - 0x%08x (%zu)\n",  rom2_start, rom2_end, rom2_size);
return 0;
}

 

++++ printf 出力

  ROM1: 0x00010000 - 0x0001006c (108)
 ROM2: 0x00020000 - 0x0002006c (108)

 

まとめ

リンカ設定ファイルにてブロックの定義を行うことで、同じ名前のセクションを別の領域に分割して配置した場合でも、正しく配置アドレスやサイズを取得することが可能です。

 

全ての製品名は、それぞれの所有者の商標または登録商標です

 

© IAR Systems 1995-2018 - All rights reserved.

We use cookies on this website to provide you with a better experience. You need to accept cookies to continue using this site. Cookies