2.5.6. スタックポインタの初期化

リセットハンドラは、少なくとも、アプリケーションで使用される実行モードのスタックポインタに初期値を割り当てる必要があります。

Example 2.10 では、スタックが stack_base に配置されます。このシンボルにはハードコーディングされたアドレスを指定することができます。または、別のアセンブラソースファイルで定義し、スキャッタローディング記述ファイルによって配置することもできます。この方法の詳細については、スキャッタローディング記述ファイルでのスタックとヒープの配置を参照して下さい。

Example 2.10. スタックポインタの初期化

; --- Amount of memory (in bytes) allocated for stacks
Len_FIQ_Stack    EQU     256
Len_IRQ_Stack    EQU     256
...
Offset_FIQ_Stack         EQU     0
Offset_IRQ_Stack         EQU     Offset_FIQ_Stack + Len_FIQ_Stack
...
Reset_Handler

; stack_base could be defined above, or located in a description file
        LDR     r0, stack_base ;

; Enter each mode in turn and set up the stack pointer
        MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
        SUB     sp, r0, #Offset_FIQ_Stack

        MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
        SUB     sp, r0, #Offset_IRQ_Stack
        ...

Example 2.10 では、FIQ モードおよび IRQ モードに 256 バイトのスタックを割り当てていますが、他の実行モードにも同じように割り当てることができます。スタックポインタをセットアップするには、各モードに(割り込みをディセーブルして)入り、スタックポインタに適切な値を割り当てます。

リセットハンドラでセットアップされるスタックポインタの値は、C ライブラリ初期化コードにより、パラメータとして __user_initial_stackheap() に自動的に渡されます。そのため、この値は __user_initial_stackheap() によって変更することはできません。

Example 2.11 は、Example 2.10 で示したスタックポインタのセットアップに使用できる __user_initial_stackheap() の実装を示しています。

Example 2.11. 

    IMPORT heap_base
    EXPORT __user_initial_stackheap

__user_initial_stackheap

; heap base could be hard-coded, or placed by description file
    LDR   r0,=heap_base
    ; r1 contains SB value
    BX   lr
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential