# OS_InitArena

## 構文

      #include <nitro/os.h>

      void OS_InitArena( void );

## 引数

なし。

## 返り値

なし。

## 説明

アリーナの下位境界、上位境界を設定します。

この関数は、Alloc関数や他のArena関数よりも先に一度だけ呼ばれる必要があります。通常、`OS_Init()` の内部から呼ばれていますのでユーザによるそれ以降の呼び出しは必要ありません。この関数の二度目以降の呼び出しは無視されます。

`OS_InitArena()` を呼び出した後に `OS_SetArenaLo()` や `OS_SetArenaHi()` でアリーナの境界を変更することが可能です。

TwlSDK では、メインメモリ(ARM9用、ARM7用)、メインメモリ拡張部分、ITCM、DTCM、共有メモリユーザ部分、共用ワークRAM(ARM9用、ARM7用)、ARM7専用ワークRAM の9つのアリーナ領域を設定することが出来ます。それぞれの領域にはIDが振られており、OSArenaId 列挙型で以下のように定義されています。

アリーナID | アリーナ | 初期化
--- | --- | ---
OS_ARENA_MAIN | メインメモリ上のアリーナ(ARM9専用) | ARM9から
OS_ARENA_MAIN_SUBPRIV | メインメモリ上のアリーナ(ARM7専用) | ARM7から
OS_ARENA_MAINEX | メインメモリ上の拡張アリーナ | ARM9から
OS_ARENA_ITCM | ICTM上のアリーナ | ARM9から
OS_ARENA_DTCM | DTCM上のアリーナ | ARM9から
OS_ARENA_SHARED | 共有メモリ上のユーザ領域のアリーナ | ARM9から
OS_ARENA_WRAM_MAIN | 共有ワークRAM上のアリーナ(ARM9用) | ARM9から
OS_ARENA_WRAM_SUB | 共有ワークRAM上のアリーナ(ARM7用) | ARM7から
OS_ARENA_WRAM_SUBPRIV | ARM7専用ワークRAM上のアリーナ | ARM7から

ARM9の`OS_InitArena()`では９つあるアリーナのうち、ARM7専用のメインメモリ上のアリーナと、ARM7用共有ワークRAM上アリーナと、ARM7専用ワークRAMアリーナを除く6つを、ARM7の`OS_InitArena()`ではARM9で除いた3つのアリーナについて設定します。

両プロセッサから`OS_InitArena()` を呼ぶことで、各アリーナの上位境界・下位境界は以下のように設定されます。

アリーナ | 下位 | 上位
--- | --- | ---
メインメモリ上のアリーナ(ARM9専用) | SDK_MAIN_ARENA_LO (lcf から取得) | HW_MAIN_MEM_MAIN_END( 0x023e0000 )
メインメモリ上のアリーナ(ARM7専用) | SDK_SUBPRIV_ARENA_LO(lcf から取得) | ARM7専用メインメモリ領域最上位
メインメモリ上の拡張アリーナ | 0 または SDK_SECTION_ARENA_EX_START (lcf から取得)*1 | 0 または デバッガ領域の前 *1
ITCM上のアリーナ | SDK_SECTION_ARENA_ITCM_START (lcf から取得) | ITCM最上位 (0x02000000)
DTCM上のアリーナ | SDK_SECTION_ARENA_DTCM_START (lcf から取得) *2 | システムモード用スタックの前 *2
共有メモリ上のユーザ領域のアリーナ | 共有メモリ最下位 | 共有メモリシステム領域の前
共有ワークRAM上のアリーナ(ARM9用) | 共有ワークRAM最下位 *3 | 共有ワークRAM最下位 *3
共有ワークRAM上のアリーナ(ARM7用) | *4 | 共有ワークRAM最上位
ARM7専用ワークRAM上のアリーナ | *5 | システムモード用スタックの前

*1 メインメモリ拡張アリーナは、`OS_EnableMainExArena()` で使用を宣言しないと使用できません。使用できない場合はメインメモリ拡張アリーナの下位・上位アドレスは 0 となります。また、製品版DSでは、拡張メインメモリはありませんので、メインメモリ上の拡張アリーナはありません。この場合も下位・上位アドレスともに 0 となります。

*2スタックを最大まで使用するようにしている場合、DTCMアリーナ用に領域がとれません。この場合、DTCMアリーナの上位と下位アドレスは同じ値になります。DTCMアリーナ用に領域を確保する場合は、lsf ファイルでスタックサイズを調節して空き領域を用意する必要があります。( lsf および lcf については ツール/makelcf ・ ツール/makelcf.TWL を参照してください。) なおここでシステムモード用のスタックと記述していますが、通常はランチャースレッドのスタックとなります。

*3共用ワークRAM上のアリーナ(ARM9用)は下位と上位が同じアドレスになっています。つまりデフォルトで大きさは0です。

*4 ARM7のスタティックモジュールの最終アドレスと、共有ワーク最上位アドレスのうち小さい方となります。すなわち、ARM7のスタティックモジュールが共有ワークに収まりきれば、空き領域がARM7用共有ワークRAM上アリーナとなり、収まりきらなければARM7用共有アリーナの開始アドレスと終了アドレスはともに共有ワーク最上位アドレスとなりアリーナの大きさは0となります。

*5 ARM7のスタティックモジュールの最終アドレスと、ARM7専用ワークRAMの最下位アドレスのうち大きい方となります。すなわち、ARM7のスタティックモジュールがARM7専用ワークRAMにまで及ぶようならば、それを除いた空き部分をARM7専用ワークRAMアリーナとし、モジュールがそこまで大きくなくてARM7専用ワークRAMに及ぶことがないのなら、ARM7専用ワークRAM先頭からをアリーナとする、ということになります。

詳細は、アリーナの概要 の説明をご覧下さい。

## 参照

`OS_SetArenaHi, OS_SetArenaLo, OS_GetArenaHi, OS_GetArenaLo
ツール/makelcf
アリーナの概要
`

## 履歴

2009/05/19 「説明」項の OS_Init() との関係についての記述を修正
2005/08/27 DTCM, ITCM, 拡張メインメモリアリーナの初期設定アドレス変更
2004/11/02 初期化するアリーナ個数の誤りを訂正
2004/10/26 アリーナについての図解説明を分離
2004/10/01 overlayを絡めて説明
2004/09/29 図を入れてアリーナ領域を説明
2004/05/28 ARM7のアリーナについての記述変更
2004/02/19 アリーナ個数が6→9個に。両プロセッサへの対応
2004/01/16 MainEx について追加
2004/01/06 初版