TOPPERS/FMP3 リリースとの相違点
SOLID-OSにおけるカーネルでは以下の点がオリジナルのTOPPERS/FMP3と仕様または動作が異なります
対応予定の拡張機能
SOLID-OS の FMP3 カーネルでは、SOLID-OS の ASP3カーネル もしくは FMPカーネルでサポートしている 以下の拡張機能については、現時点では未サポートですが、今後のアップデートで対応予定です。
メッセージバッファ拡張パッケージ
ミューテックスのロック解除順序についての制限緩和
タスク起動要求キューイング数/タスク起床要求キューイング数の上限をコンフィグレーション可能
非タスクからの clr_flg 呼び出し可能
タイマーイベントハンドラを各コアで実行可能
各プロセッサアイドル時間取得機能
実行中タスクのローテート(=同一優先度中で優先順位を最低にする) (xsm_imsbk_rtk)
イベントフラグ待ち解除時のビットクリア指定の拡張
カーネル内の各資源について最大数を取得するAPI
カーネル内の生成済み動的生成資源数を取得するAPI
対応している拡張機能
SOLID-OSにおけるカーネルでは以下の点がオリジナルのTOPPERS/FMP3と仕様または動作が異なります
カーネル資源の静的な生成方法
SOLID-OSではタスクなどのカーネル資源を生成するために, カーネル起動時に読み込まれるパラメータをC言語のテーブルに 記述しておくことで行います。
割込み及び例外の処理
SOLID-OSにおいてはCPUからの割込み及び例外の処理はCore Serviceの内部で行われます。
割込み処理については関連システムコールはオリジナル実装と同様に動作します。 ただし、kernel_cfg.cの中の設定テーブルに記述されていな割込みについては すべてカーネル管理外の割込みとして扱われます。
例外処理についてはすべてCore Serivceの内部で処理が完結します。 プロセッサ例外時でもカーネルに通知が行われないため、 以下のシステムコールは未実装か、オリジナルのカーネル仕様通りには機能しません。
def_exc
xns_dpn
割り込み優先度/割り込み優先マスクの扱いについて
割り込み優先度のレベル数は32段階固定{TIPM_ENAALL(0),TMAX_INTPRI(-1),..TMIN_INTPRI(-31)}で定義され、 TMAX_INTPRIが割り込みコントローラの最も低い優先度に対応します(以降、TOPPERS優先度が-1するごとに優先度が1ずつ高くなります)
- 割り込みコントローラの割込み優先度レベル数が32未満の場合
割込みハンドラの登録(kernel_cfg.c)
kernel_cfg.cで割込み初期化テーブルに設定された優先度が割り込みコントローラがサポートする最高優先度を超える場合、割り込みコントローラの最高優先度でハンドラの登録を行います。
chg_ipmの動作
パラメータ intpriに指定された優先度が割り込みコントローラがサポートする最高優先度を超える場合、割り込みコントローラの最高優先度でハンドラの登録を行います。
get_ipmの動作
get_ipmは割り込みコントローラに実際に設定されている割込みマスク値に対応する範囲内で優先度を返します。 上述のchg_ipmの動作により、割り込みコントローラでサポートする優先度の範囲外の値を設定した場合には get_ipmは割込みコントローラがサポートする最高の優先度に対応する値を返すため、 chg_ipmの設定値とその後のget_ipmの取得値は一致しません。
割り込みコントローラの割込み優先度レベル数が32を超える場合
get_ipmの動作
割込みコントローラか取得したマスク値がTOPPERS側の最高優先度(TMIN_INTPRI)を超えている場合にはエラーとはせずにTMIN_INTPRI(-1)を値として返します。
静的資源カーネルにおいて以下のAPIにおけるパラメータ制限が緩和されています
それぞれ、CRE_DTQ での dtqmp, CRE_PDQ での pdqmb、CRE_MPF での mpfmb に NULL 以外を指定してもエラーになりません。(動的生成拡張サポートカーネルと同等)。
CRE_DTQ [ASPS0132]
CRE_PDQ [ASPS0142]
CRE_MPF [ASPS0166]
割り込み操作APIの対象割込み番号
以下のAPIについてASP3.3.0以降のリリースではカーネルに登録された割込み(カーネル管理割込み)以外の割込み番号をパラメータに渡した場合にエラーとなりますが、SOLIDでは指定された割込みについて割り込みコントーラへの操作を試みます
dis_int
ena_int
clr_int
ras_int
prb_int
複数プロセッサをターゲットする割込みの指定が可能
カーネル起動時に読み込まれる割込みハンドラのパラメータテーブルでGICが通知するターゲットのCPUコアを複数指定することができます
複数プロセッサをターゲットとする割込みの設定について
同じ割込み番号(IRQNO)に対し、複数のプロセッサを指定可能となりました。
注釈
SGI/PPIの場合: あるIRQNOに対してプロセッサ毎に異なるハンドラを設定可能です。 SPIの場合: あるIRQNOに対して全プロセッサに共通な一つのハンドラのみ設定可能です。
割り込み設定はマクロ CFG_DEF_INT / CFG_DEF_INT_MTを使用してkernel_cfg.cに記述します。
割込み初期化設定ブロックの設定例(kernel_cfg.c)
#define INTNO_SGI_1 1 // SGI #1 #define INTNO_SGI_2 2 // SGI #2 #define INTNO_16_1 16 // 割込み番号16 #define INTNO_17_2 17 // 割込み番号17 #define INTNO_PPI_1 1 // PPI extern void int_handler_int17(void); extern void sgi_handler_p1(void); extern void sgi_handler_p2(void); extern void sgi_handler_p3(void); extern void sgi_handler_p4(void); extern void sgi_handler_common(void); extern void spi_handler_common(void); // // 割込み初期化ブロック // const INTINIB _kernel_intinib_table[] = { // IRQ1 <- 最低優先度、ISRを使用, プロセッサ1のみ CFG_DEF_INT(INTNO_16_1, INTINI_USE_ISR, TA_NULL,(-1), 1), // IRQ2 <- 最高優先度、直接割込みハンドラ関数を登録, すべてのプロセッサに割込みを設定 CFG_DEF_INT_MT(INTNO_17_2, int_handler_int17, TA_NULL,(-32), CFG_PROC_MASK_ANY), // SGIを複数コアをターゲットにしてプロセッサ毎に個別のハンドラを // 登録する例 CFG_DEF_INT(INTNO_SGI_1, sgi_handler_p1, TA_ENAINT, (-2), 1), CFG_DEF_INT(INTNO_SGI_1, sgi_handler_p2, TA_ENAINT, (-2), 2), CFG_DEF_INT(INTNO_SGI_1, sgi_handler_p3, TA_NULL, (-2), 3), CFG_DEF_INT(INTNO_SGI_1, sgi_handler_p4, TA_ENAINT, (-2), 4), // SGIを複数コアをターゲットにしてプロセッサ毎に共通のハンドラを // 登録する例 (affinity_maskを使用して複数コア分を1行で登録) // 下記の例ではSGI発行でprc(1,2,3)で割り込み発生し、同じハンドラ関数が呼び出されます。 CFG_DEF_INT_MT(INTNO_SGI_2, sgi_handler_common, TA_ENAINT, (-2), (CFG_PROC_MASK(1) | CFG_PROC_MASK(2) | CFG_PROC_MASK(3))), // SPIを複数コアをターゲットにしてプロセッサ毎に共通のハンドラを // 登録する例 (affinity_maskを使用して複数コア分を1行で登録) CFG_DEF_INT_MT(INTNO_PPI_1, spi_handler_common, TA_ENAINT, (-2), CFG_PROC_MASK_ANY), };警告
GICv3以降の環境でAffinity Routingを使用している場合など、GICのコンフィグレーションに よってはCFG_DEF_INT_MTによる複数コアをターゲットにした登録が行えない場合があります。 この場合、affinity_maskで最も下位のビットにあたるプロセッサ1個の身に対して 割込みがあがる様に設定を行います。(affinity_mask中の他のプロセッサは対象外)
CPU0以外をマスタープロセッサコアに指定可能
SOLID-OS のマスタープロセッサコアを CPU0 以外に変更可能です
マスタープロセッサコアを指定する場合は、ビルドするアプリケーションで以下のプロパティを設定してください。
SOLID_BOOT_CPUID <- CPU ID を指定。省略時は "0" 指定として処理
マルチCPUクラスタに対応
マルチCPUクラスタの SoC にも対応しています
マルチCPUクラスタの SoC の場合には、以下のマクロを定義してください
SOLID_ARM_MULTICLUSTER <- =の後は、クラスタ0のCPU数を指定する(現状2,4のみ対応)
制限事項
スピンロックの動的削除(del_spn)は機能せずエラーになる
スピンロックはエミュレート方式のみ対応しています。今後のリリースで対応予定です。