1106568_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

1106568_ja-JP

1106568_ja-JP

HOWTO: GNU ビルドツールを使用して RAM メモリからライブラリ関数を実行する<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

このドキュメントでは、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_text

2)次に、 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に配置する場合は、その関数によって呼び出されるサブ関数(通常は別のオブジェクトファイルにあります)を追加することを常に検討してください。

CC++ ライブラリコンパイラ・アセンブラ・リンカ
タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-20-2025 12:12 AM
更新者: