4.61 古い関数 __user_initial_stackheap()

従来のソースコードを使用している場合は、rt_misc.h__user_initial_stackheap() が使用されている可能性があります。これは、従来のソースコードとの下位互換性を保つためだけにサポートされている古い関数です。

これに相当する新しいバージョンの関数は __user_setup_stackheap() です。

構文

extern __value_in_regs struct __initial_stackheap __user_initial_stackheap(unsignedR0, unsignedSP, unsignedR2, unsigned SL);

使用法

__user_initial_stackheap() の戻り値は以下のとおりです。
  • r0 のヒープベース。
  • r1 のスタックベース(つまり、スタック領域の最上位アドレス)。
  • r2 のヒープリミット。
この関数を再実装する場合には、以下のガイドラインに従う必要があります。
  • 88 バイトを超えるスタックは使用しない。
  • r12ip)以外のレジスタは更新しない。
  • ヒープ内は常に 8 バイト境界の整列を守る。
__main() が呼び出されたときの spr13)の値は、r1 に引数として渡されます。セミホスティング SYS_HEAPINFO を使用する __user_initial_stackheap() のデフォルトの実装は、モジュール sys_stackheap.o 内のライブラリによって提供されます。
sp を実行環境から引き継ぎ、ヒープを持たない __user_initial_stackheap() を作成するには、r0r2r1 の値を設定して戻ります。
スタックのサイズに制限はありません。ただし、ヒープ領域がスタックにオーバーラップする場合は、malloc() がオーバーラップしているメモリの検出を試み、新しいメモリ割り当て要求を失敗させます。
rt_misc.h 内の __initial_stackheap の定義は以下のとおりです。
struct __initial_stackheap {     unsigned heap_base; /* 初期ヒープの下位アドレスの末尾 */     unsigned stack_base; /* 初期スタックの上位アドレスの末尾 */     unsigned heap_limit; /* 初期ヒープの上位アドレスの末尾 */     unsigned stack_limit; /* 使用しない */ };

Full Descending スタックを使用しているため、stack_base の値は、スタックで使用される最上位アドレスより 0x1 大きくなります。
関連する概念
1.66 スタックポインタの初期化とヒープの上下限
1.69 __user_initial_stackheap() の従来のサポート
関連する参考文書
1.29 C ライブラリ関数の直接セミホスティング依存関数
4.54 __user_setup_stackheap()
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.