同じ名前のセクションを別の領域に分割して配置した際の、配置アドレスを取得する
テクニカル・ノート 181232J
アーキテクチャ:
ARM
コンポーネント:
更新日:
2019/02/08 8:03
はじめに
本テクニカルノートでは、同じ名前のセクションを別の領域に分割して配置した際の、配置アドレスを取得する方法について説明します。
解説
同じセクション名の.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)
まとめ
リンカ設定ファイルにてブロックの定義を行うことで、同じ名前のセクションを別の領域に分割して配置した場合でも、正しく配置アドレスやサイズを取得することが可能です。
全ての製品名は、それぞれの所有者の商標または登録商標です