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 領域を定義した場合、スタックは領域の先頭から始まります。ヒープは末尾から始まります。

サンプル

アセンブリ言語を使用して初期スタックポインタおよびヒープポインタをセットアップするには、次のようにします。
    EXPORT __initial_sp
__initial_sp EQU 0x100000        ; スタックの一番上
    EXPORT __heap_base
__heap_base  EQU 0x400000        ; ヒープの開始位置
    EXPORT __heap_limit
__heap_limit EQU 0x800000        ; ヒープの終了位置
C の組み込みアセンブラを使用して初期スタックポインタおよびヒープポインタを設定するには、次のようにします。
__asm void dummy_function(void)
{
    EXPORT __initial_sp
__initial_sp EQU 0x100000        ; スタックの一番上
    EXPORT __heap_base
__heap_base  EQU 0x400000        ; ヒープの開始位置
    EXPORT __heap_limit
__heap_limit EQU 0x800000        ; ヒープの終了位置
}
関連する概念
2.1 microlib について
2.2 microlib とデフォルトの C ライブラリの違い
2.3 microlib のライブラリヒープ使用状況の要件
2.4 microlib でサポートされていない ISO C 機能
2.5 microlib を使用したアプリケーションのビルド
2.7 microlib とリンクしたプログラムの開始と終了
1.67 __initial_sp、__heap_base、および __heap_limit の定義
関連する参考文書
2.8 microlib 入出力関数のカスタマイズ
関連情報
スキャッタロードについて
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.