ブート

ブートでは、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起動用情報へのポインタ