ブート
ブートでは、SOLIDのコアサービスを起動するために、メモリの初期化やコアサービスの転送を行う必要があります。 このために、要実装関数で、各ターゲットに合わせた初期化コードを追加してください。
ブート処理中は、MMUが無効、または論理アドレス=物理アドレスの状態で動作します。
コアサービスが使用するメモリ領域(メモリマップデザイナにてSOLID_COREで指定した部分)には、 ブートのコード、データ、スタック等を配置しないようにして下さい。
本項
SOLIDが対応するブートの手順は2通りあります。 1つはすでにブートローダーが存在し、そのブートローダーがSOLIDのデータをRAMに展開して実行する形式、もう1つはブートローダーが存在せず、IPLからSOLIDを実行する形式です。
ブートローダーが存在する場合
SOLID_USE_MONOBUILD を使用すると、すべてのコード、データをSOLIDの領域に配置します。bootをビルドしてできたsolid_boot.outをバイナリ化して、SOLIDの物理アドレスに転送し、_solid_boot_startのアドレスから実行してください。
要実装関数では、IMPL_BOOT_Init()
にてペリフェラル等の初期化、SMP時には IMPL_BOOT_SMP_Init()
にて他コアの初期化を行ってください。
ブートローダーが存在しない場合
リセット後にアクセスできる領域にブートのコード、データを配置し、_solid_boot_startのアドレスから実行してください。
要実装関数では、ブートローダが存在する場合に実装する IMPL_BOOT_Init()
、IMPL_BOOT_SMP_Init()
に加え、IMPL_BOOT_GetCsInfo()
および IMPL_BOOT_LoadCs()
にてプロジェクトで生成された.outを指定された領域に転送してください。
要実装関数
ブート関連の要実装関数の定義は、 impl_boot.h にあります。
#include "impl_boot.h"
IMPL_BOOT_Init
-
void IMPL_BOOT_Init()
デバイスの初期化をします。
主にメモリ、およびCPU周辺のIOを初期化してください。
IMPL_BOOT_GetArgument
-
void IMPL_BOOT_GetArgument(unsigned char *args, unsigned long size)
引数の設定をします。
起動時にコアサービスへ渡す引数を設定してください。
- パラメータ:
arg -- 引数を格納するバッファ
size -- 引数の最大サイズ
IMPL_BOOT_GetCsInfo
-
void IMPL_BOOT_GetCsInfo(void *pBuf, unsigned long bufSize)
コアサービスのバイナリ情報を取得します。
solid_cs.binの先頭のデータを転送してください。
- パラメータ:
pBuf -- 転送する位置
bufSize -- 転送するサイズ(byte)
IMPL_BOOT_LoadCs
-
void IMPL_BOOT_LoadCs(void *pAddr)
コアサービスのバイナリを転送します。
solid_cs.binを指定位置に転送してください。
- パラメータ:
pAddr -- solid_cs.binを転送する先頭アドレス
SMP時の要実装関数
SOLID_BOOT_SMP_INFO
-
typedef struct _SOLID_BOOT_SMP_INFO_ SOLID_BOOT_SMP_INFO
説明
SMP起動用情報の構造体
定義
typedef struct _SOLID_BOOT_SMP_INFO_ { unsigned long bootAddress; int nCpus; } SOLID_BOOT_SMP_INFO;
メンバー
- bootAddress
他CPUのジャンプアドレス
- nCPus
SOLIDで使用するCPUの数
IMPL_BOOT_SMP_Init
-
void IMPL_BOOT_SMP_Init(SOLID_BOOT_SMP_INFO *pInfo)
SMP時の他CPUの初期化を行います。
CPUがリセット状態の場合は、ここで解除してください。
- パラメータ:
pInfo -- SMP起動用情報へのポインタ