TOPPERS/FMP3 リリースとの相違点

SOLID-OSにおけるカーネルでは以下の点がオリジナルのTOPPERS/FMP3と仕様または動作が異なります

対応予定の拡張機能

SOLID-OS の FMP3 カーネルでは、SOLID-OS の ASP3カーネル もしくは FMPカーネルでサポートしている 以下の拡張機能については、現時点では未サポートですが、今後のアップデートで対応予定です。

  • 優先度拡張パッケージ

  • 優先度継承ミューテックス機能

  • メッセージバッファ拡張パッケージ

  • 動的生成機能拡張パッケージ

  • ミューテックスのロック解除順序についての制限緩和

  • タスク起動要求キューイング数/タスク起床要求キューイング数の上限をコンフィグレーション可能

  • 非タスクからの clr_flg 呼び出し可能

  • タイマーイベントハンドラを各コアで実行可能

  • Readers/Writerロックのサポート

  • 各プロセッサアイドル時間取得機能

  • 指定優先度以下の実行待ちタスクの中から最も優先度及び優先順位場高いタスクIDの取得(xsm_get_frt, xsm_iget_frt)

  • 実行中タスクのローテート(=同一優先度中で優先順位を最低にする) (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

静的資源カーネルにおいて以下の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)は機能せずエラーになる

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