2.6 microlib で使用するスタックおよびヒープの設定

microlib を使用するには、スタックの初期ポインタを指定する必要があります。初期ポインタは、スキャッタファイル内または __initial_sp シンボルを使用して指定できます。

malloc()calloc()realloc()free() などのヒープ関数を使用するには、ヒープ領域の位置とサイズを指定する必要があります。
microlib で使用するスタックおよびヒープは、以下のいずれかの方法で指定できます。
  • スタックの一番上を指すシンボル __initial_sp を定義します。ヒープを使用している場合は、シンボル __heap_base および __heap_limit も定義します。
    __initial_sp は、8 バイトの倍数に境界整列されている必要があります。
    __heap_limit では、ヒープ領域の最後のバイトより上のバイトを指す必要があります。
  • スキャッタファイル内で、以下のいずれかの操作を行います。
    • ARM_LIB_STACK 領域と ARM_LIB_HEAP 領域を定義します。
      ヒープを使用しない場合は、ARM_LIB_STACK 領域のみを定義します。
    • ARM_LIB_STACKHEAP 領域を定義します。
      ARM_LIB_STACKHEAP 領域を定義した場合、スタックは領域の先頭から始まります。ヒープは末尾から始まります。

サンプル

armasm アセンブリ言語を使用して初期スタックポインタおよびヒープポインタをセットアップするには、次のようにします。
    .global __initial_sp
.equ __initial_sp, 0x10000        ; スタックの一番上
    .global __heap_base
.equ __heap_base, 0x400000        ; ヒープの開始位置
    .global __heap_limit
.equ __heap_limit, 0x800000       ; ヒープの終了位置
C のインラインアセンブラを使用して初期スタックポインタを設定するには、次のようにします。
asm("  .global __initial_sp\n"
    "  .equ __initial_sp, 0x10000\n" /* スタックの一番上と等しい */
);
C のインラインアセンブラを使用してヒープポインタを設定するには、次のようにします。
asm("  .global __heap_base\n"
    "  .equ __heap_base, 0x400000\n"  /* ヒープの開始位置と等しい */
    "  .global __heap_limit\n"
    "  .equ __heap_limit, 0x800000\n" /* ヒープの終了位置と等しい */
);
関連する概念
2.1 microlib について
2.2 microlib とデフォルトの C ライブラリの違い
2.3 microlib のライブラリヒープ使用状況の要件
2.4 microlib でサポートされていない ISO C 機能
2.5 microlib を使用したアプリケーションのビルド
2.7 microlib とリンクしたプログラムの開始と終了
1.11.3 スタックポインタの初期化とヒープの上下限
関連する参考文書
2.8 microlib 入出力関数のカスタマイズ
関連情報
スキャッタロードについて
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.