2.4.7. ランタイムメモリモデル

2 つのランタイムメモリモデルが用意されています。

どちらのランタイムメモリモデルでも、スタックはチェックされずに拡大します。

Note

Integrator システムでは、どちらのモデルも使用できます。

1 領域モデル

デフォルトの 1 領域モデルでは、アプリケーションのスタックとヒープが、同じメモリ領域内で互いに向かって拡大します。この場合のヒープは、新しいヒープ空間が割り当てられると(例えば、malloc() が呼び出されると)、スタックポインタの値に照らし合わせてチェックされます。

Figure 2.10Example 2.5 は、単純な 1 領域モデルを実装する __user_initial_stackheap() の例を示しています。このモデルでは、スタックがアドレス 0x40000 から下方に拡大し、ヒープが 0x20000 から上方に拡大します。

このルーチンは、適切な値をレジスタ r0r1 にロードしてから呼び出しルーチンに復帰します。1 領域モデルではヒープリミットが使用されないため、レジスタ r2 は変更されません。レジスタ r3 は使用されません。

Figure 2.10. 1 領域モデル

1 領域モデル

Example 2.5. 1 領域モデルのルーチン

    EXPORT __user_initial_stackheap

__user_initial_stackheap
    LDR r0, =0x20000 ;HB
    LDR r1, =0x40000 ;SB
    ; r2 not used (HL)
    ; r3 not used
    MOV pc, lr

2 領域モデル

システム設計では、スタックとヒープを個別のメモリ領域に配置することが必要になる場合があります。

例えば、高速 RAM の一部をスタック専用に予約しておきたい場合があるとします。2 領域モデルを使用することをリンカに通知するには、アセンブラの IMPORT ディレクティブを使用して、シンボル __use_two_region_memory をインポートする必要があります。このシンボルをインポートすると、ヒープは、__user_initial_stackheap() によってセットアップされた専用のヒープリミットと照らし合わせてチェックされます。

Figure 2.11Example 2.6 は、2 領域モデルの実装例を示しています。

この例では、ヒープが 0x28000000 から 0x28080000 まで上方に拡大し、スタックが 0x40000 から下方に拡大します。

Figure 2.11. 2 領域モデル

2 領域モデル

Example 2.6. 2 領域モデルのルーチン

    IMPORT __use_two_region_memory
    EXPORT __user_initial_stackheap

__user_initial_stackheap
    LDR r0, =0x28000000 ;HB
    LDR r1, =0x40000 ;SB
    LDR r2, =0x28080000 ;HL
	; r3 not used
    MOV pc, lr
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential