このドキュメントでは、GNU ビルドツールを使用してカスタムメモリセクション(通常はRAM)からライブラリ関数を配置して実行するために必要な手順について説明しています。この手順は、どのGNUツールチェーンにも適用できます。S32 Design Studio for ARM で作成した新規S32DSプロジェクトでデモを行います。
標準ライブラリ(NewLib)のmemcpy()関数を実行したいと仮定しましょう。
1) 最初のステップは、特定のライブラリオブジェクトファイルを入力セクションから除外し(EXCLUDE_FILE を使用)、標準の.text*フラッシュセクションにリンクされないようにすることです。
EXCLUDE_FILEに関連付けられた入力セクションは、セクションリストの後半で使用される同じ入力セクションと干渉してはなりません(例:以下のリストから *(.text*) 入力セクションが削除されている場合)。EXCLUDE_FILEは *.(text*) ルールと同様に動作します。選択したファイルのみを除外し、残りの(除外されていない)入力データはすべて配置されます。
/* The program code and other data goes into internal flash */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
/* Exclude file(s) from NewLib libc.a from .text.* section */
*(EXCLUDE_FILE (*libc.a:lib_a-memcpy-stub.o) .text*)
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
} > m_text2)次に、 memcpyオブジェクトをプロジェクトの.ldファイルですでに定義されているcode_ramセクションに配置しましょう。このセクションは、RAM から実行されるコード専用です(起動ルーチンはこのセクションを初期化します)。詳細については、「HOWTO: S32 Design Studio で RAM からルーチンを実行する方法」をご覧ください。
次の行は、標準のNewLib(libc.a)に含まれるオブジェクトファイル(lib_a-memcpy-stub.o)のコード(.text* セクション)を配置します。
*libc.a:lib_a-memcpy-stub.o (.text*).code セクションに配置:
.code : AT(__CODE_ROM)
{
. = ALIGN(4);
__CODE_RAM = .;
__code_start__ = .; /* Create a global symbol at code start. */
__code_ram_start__ = .;
*(.code_ram) /* Custom section for storing code in RAM */
*libc.a:lib_a-memcpy-stub.o (.text*) /* add memcpy from the NewLib library here*/
. = ALIGN(4);
__code_end__ = .; /* Define a global symbol at code end. */
__code_ram_end__ = .;
} > m_dataプロジェクトをビルドした後、マップファイルをチェックして、memcpyが実際にRAMメモリの.codeセクションに配置されていることを確認できます。
.code 0x1fff881c 0x18 load address 0x00000d90
0x1fff881c . = ALIGN (0x4)
0x1fff881c __CODE_RAM = .
0x1fff881c __code_start__ = .
0x1fff881c __code_ram_start__ = .
*(.code_ram)
*libc.a:lib_a-memcpy-stub.o(.text*)
.text.memcpy 0x1fff881c 0x16 C:/NXP/S32DS_ARM_v2018.R1/Cross_Tools/gcc-6.3-arm32-eabi/arm-none-eabi/newlib/lib/thumb/v7e-m\libc.a(lib_a-memcpy-stub.o)
0x1fff881c memcpy
0x1fff8834 . = ALIGN (0x4)
*fill* 0x1fff8832 0x2
0x1fff8834 __code_end__ = .
0x1fff8834 __code_ram_end__ = .
0x00000da8 __CODE_END = (__CODE_ROM + (__code_end__ - __code_start__))
0x00000da8 __CUSTOM_ROM = __CODE_END関数をRAMに配置する場合は、その関数によって呼び出されるサブ関数(通常は別のオブジェクトファイルにあります)を追加することを常に検討してください。