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 での dtqmpCRE_PDQ での pdqmbCRE_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()) は機能せずエラーになる

  • スピンロックはエミュレート方式のみ対応しています。今後のリリースで対応予定です。