TOPPERS/ASP3 リリースとの相違点
対応予定の拡張機能
SOLID-OS の ASP3 カーネルでは、SOLID-OS の FMPカーネル もしくは FMP3カーネルでサポートしている 以下の拡張機能については、現時点では未サポートですが、今後のアップデートで対応予定です。
Readers/Writerロックのサポート
プロセッサアイドル時間取得機能
対応している拡張機能
SOLID-OSにおけるカーネルでは以下の点がオリジナルのTOPPERS/ASP3と仕様または動作が異なります
カーネル資源の静的な生成方法
SOLID-OSではタスクなどのカーネル資源を生成するために, カーネル起動時に読み込まれるパラメータをC言語のテーブルに 記述しておくことで行います。
ミューテックスでの優先度継承プロトコルサポート
API仕様については μITRON4.0 仕様に準拠します
割込み及び例外の処理
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]
ミューテックスのロック解除順序
SOLID-OSではunl_mtxでミューテックス解除を行う場合にロックした順番と逆順となっていなくてもエラーとはなりません。(新世代カーネル仕様と同等の動作。第3世代カーネル仕様ではE_ILUSEエラー)
割り込み操作APIの対象割込み番号
以下のAPIについてASP3.3.0以降のリリースではカーネルに登録された割込み(カーネル管理割込み)以外の割込み番号をパラメータに渡した場合にエラーとなりますが、SOLIDでは指定された割込みについて割り込みコントーラへの操作を試みます
dis_int
ena_int
clr_int
ras_int
prb_int
タスク起動要求キューイング数/タスク起床要求キューイング数
タスクに対する起動要求(act_tsk)及び起床要求(wup_tsk)のキューイング数がデフォルトでUINT32_MAXとなっています。また、それぞれにカーネル起動時パラメータで0-UINT32_MAXの範囲で変更可能です。(0の場合はキューイングを行わない動作)
非タスクコンテキストからのclr_flgを呼び出した場合の動作
SOLID-OSでは非タスクコンテキストからclr_flgを呼び出した場合、タスクコンテキストから呼び出した場合と同等の動作をします。(第3世代カーネル仕様ではE_CTXエラー)
イベントフラグ待ち解除時のクリア方法指定
イベントフラグがセットされ、待ち状態にあったタスクの待ち状態が解除される際にフラグのビットパターンのビットをクリアする方法を以下の中から選択可能です。
指定なし(クリアしない)
すべてのビットをクリア
待ち対象のビットのみクリア
待ち対象のビットのみクリアする場合はイベントフラグ待ちAPI(wai_flg/pol_flg/twai_flg)のパラメータ 待ちビットパターン(waiptn)で'1'になっているビットがすべてクリアされます。それ以外のビットは変化しません。
クリア方法の指定は資源生成時の属性とイベントフラグ待ちAPI(wai_flg/pol_flg/twai_flg)の待ちモード(wfmode)の両方で指定可能です。両方とも指定されている場合にはAPI呼び出し時のwfmodeが優先されます。
資源生成時の属性
TA_CLR
全ビットクリア
TA_BITCLR
待ち対象ビットのみクリア(追加)
API(wai_flg/pol_flg/twai_flg)の待ちモード(wfmode) [全て追加]
TWF_CLR
全ビットクリア
TWF_BITCLR
待ち対象ビットのみクリア
資源生成時の属性とAPIの待ちモードの組み合わせによる動作
生成時属性
API待ちモード
ビットクリア動作
(指定なし)
(指定なし)
ビットクリアしない
(指定なし)
TWF_CLR
全ビットクリア
(指定なし)
TWF_BITCLR
待ち対象ビットのみクリア
TA_CLR
(指定なし)
全ビットクリア
TA_CLR
TWF_CLR
全ビットクリア
TA_CLR
TWF_BITCLR
待ち対象ビットのみクリア
TA_BITCLR
(指定なし)
待ち対象ビットのみクリア
TA_BITCLR
TWF_CLR
全ビットクリア
TA_BITCLR
TWF_BITCLR
待ち対象ビットのみクリア
初期化・終了ルーチンの登録方法
オリジナルのTOPPERS/ASP3ではカーネル初期化・終了時に呼び出されるユーザ関数の実装方法がバージョンにより異なります。
3.3.0以前: kernel_cfg.cで_kernel_call_inirtn()/_kernel_call_terrtn()関数の中にユーザーの実装関数の呼出を記述
3.4.0以降: kernel_cfg.c内のテーブル(初期化ルーチンブロック/終了処理ルーチンブロック)にユーザー実装関数のアドレスとパラメータを記述
SOLIDでは互換性のため、両方の方式をサポートしています。
呼出順序は初期化の場合 (a)→(b)、終了処理の場合は(b)→(a)となります。 (b)のそれぞれのテーブル内の関数呼出の順序は初期化においても終了処理においてもテーブル上の記述の順序通りに呼び出されます。
3.3.0以前のカーネル用のkernel_cfg.cの移行について (b)を使用しない場合 → 特に変更の必要はありません。 (b)を使用したい場合 → templateを参考に以下の定義をkernel_cfg.cに追加してください。
#define USE_INITER_RTN_BLOCK // 初期化ルーチンブロック/終了処理ルーチンブロックの使用を宣言 /* * 初期化ルーチンブロックテーブル */ const INIRTNB _kernel_inirtnb_table[] = { { "ユーザー関数アドレス", "拡張情報(呼出パラメータ)" }, }; /* * 終了処理ルーチンブロックテーブル */ const TERRTNB _kernel_terrtnb_table[] = { { "ユーザー関数アドレス", "拡張情報(呼出パラメータ)" }, };初期化ルーチンブロックテーブル及び終了処理ルーチンブロックテーブルの詳細についてはカーネル起動パラメータ設定の 初期化ルーチンブロックテーブル と 終了処理ルーチンブロックテーブル の項を参照してください。
タスク実装によるμITRONサービスコールエミュレーション(可変長メモリプール)
可変長メモリプールについては、基本的に SOLID-OS のコアサービスで提供する SOLID_malloc()やSOLID_free()等の サービスコールへの置き換えを推奨します。メモリプールの確保ができない場合に待ちを発生させたい場合に、このエミュレーションを 使用してください。
API仕様については、基本的に μITRON4.0仕様に準拠します。API仕様と振る舞いの点で以下の差分があります
可変長メモリエミュレーションの初期化関数呼び出し前に、可変長メモリAPIをコールすると assert() が発生します
生成時にTA_PRIを指定したとしても、TA_FIFO が指定された扱いになります(エラーにはなりません)
ただし、以下の制限事項があります。
動的生成をサポートしたカーネルのみ対応です
カーネル資源の占有
排他処理用にエミュレーション全体としてセマフォを1つ生成します
生成する可変長メモリプール1つにつき、セマフォを1つ生成します
他タスクによる rel_wai(), ter_tsk() 後の整合性をとる処理のために最高優先度タスクを1つ生成する必要があります
メモリプール属性の制限
生成時にTA_PRIを指定したとしても、TA_FIFO として処理されます
rel_wai(), ter_tsk() 呼び出し後に後始末が必要
エミュレーション内の制御資源の整合性をとるために、rel_wai(), ter_tsk() 呼び出し後に、それぞれ rel_wai_with_emu(), ter_tsk_with_emu() の呼び出しが必要
利用方法
プロジェクトに以下のファイルを追加
rtos\toppers_asp3\asp3\solid_extension\mempool\mempool.c
rtos\toppers_asp3\asp3\solid_extension\mempool\mempool.h
rtos\toppers_asp3\asp3\solid_extension\task_manage\task_relwai_with_emu.c
rtos\toppers_asp3\asp3\solid_extension\task_manage\task_term_with_emu.c
エミュレーション利用前に以下のタスクを生成 (TA_ACT, 最高優先度)
rel_wai_with_emu_task() : task_relwai_with_emu.c
ter_tsk_with_emu_task() : task_term_with_emu.c
エミュレーション利用前に以下の初期化APIをコール
initialize_mempool_emulation() : mempool.c
タスク実装によるμITRONサービスコールエミュレーション(メールボックス)
TOPPERSの第三世代カーネルでは、ほとんどの用途でデータキューで置き換えが可能ため、 メールボックスは廃止されました。ただ、データキューには、送信待ち状態が起きる可能性があり、 これを避ける場合は、このエミュレーションを利用可能です。
API仕様については、基本的に μITRON4.0仕様に準拠します。API仕様と振る舞いの点で以下の差分があります
メールボックスエミュレーションの初期化前に、メールボックスAPIをコールすると assert() が発生します
生成時にTA_PRIを指定したとしても、TA_FIFO が指定された扱いになります(エラーにはなりません)
ref_mbx() はサポートしていません。
ただし、以下の制限事項があります。
動的生成をサポートしたカーネルのみ対応です
カーネル資源の占有
排他処理用にエミュレーション全体としてセマフォを1つ生成します
生成する可変長メモリプール1つにつき、セマフォを1つ生成します
他タスクによる rel_wai(), ter_tsk() 後の整合性をとる処理のために最高優先度タスクを1つ生成する必要があります
メールボックス属性の制限
生成時にTA_PRIを指定したとしても、TA_FIFO として処理されます
rel_wai(), ter_tsk() 呼び出し後に後始末が必要
エミュレーション内の制御資源の整合性をとるために、rel_wai(), ter_tsk() 呼び出し後に、それぞれ rel_wai_with_emu(), ter_tsk_with_emu() の呼び出しが必要
利用方法
プロジェクトに以下のファイルを追加
rtos\toppers_asp3\asp3\solid_extension\mailbox\mailbox.c
rtos\toppers_asp3\asp3\solid_extension\mailbox\mailbox.h
rtos\toppers_asp3\asp3\solid_extension\task_manage\task_relwai_with_emu.c
rtos\toppers_asp3\asp3\solid_extension\task_manage\task_term_with_emu.c
エミュレーション利用前に以下のタスクを生成 (TA_ACT, 最高優先度)
rel_wai_with_emu_task() : task_relwai_with_emu.c
ter_tsk_with_emu_task() : task_term_with_emu.c
エミュレーション利用前に以下の初期化APIをコール
initialize_mailbox_emulation() : mailbox.c