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

対応予定の拡張機能

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

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

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

対応している拡張機能

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


カーネル資源の静的な生成方法

SOLID-OSではタスクなどのカーネル資源を生成するために、カーネル起動時に読み込まれるパラメータをC言語のテーブルに記述しておくことで行います。


ミューテックスでの優先度継承プロトコルサポート

API仕様については μITRON4.0 仕様に準拠します


自タスクの終了と削除(exd_tsk()) [動的生成機能拡張パッケージ(ビルド時オプション)]

  • 自タスクの終了と削除を行います。( acre_tsk() で生成されたタスクのみ)

#include <kernel.h>
ER exd_tsk(void);
/*
*    自タスクの終了と削除
*
*   <param>
*   (なし)
*
*   <return value>
*   (戻り値)エラーコード(<errors>参照のこと)
*
*   呼び出したタスクを終了させ、さらにタスクの削除を行います。
*   具体的には以下の処理を行います。
*
*   - タスクの終了(タスクの状態を休止状態[DORMANT]に変更)
*   - システム状態をCPUロック解除状態,割込み優先度マスク全解除状態,
*      ディスパッチ許可状態に復旧
*   - 呼び出したタスクに対して起動要求がキューイングされている場合に
*      キューイングをクリア(タスク終了後の再起動は行わない)
*   - 呼び出したタスクがミューテックスをロックしていた場合、
*      全て解放
*   - タスクの削除(タスク管理ブロック,スタック等の解放)
*
*   exd_tskが正常に処理された場合にはexd_tskからはリターンすることは
*   ありません。(非タスクコンテキストから呼び出された場合を除く)
*
*     [補足]
*     - 呼び出したタスクが静的に生成されたタスクであった場合には
*      タスクの削除は行わず、休止状態のままとなります。
*      静的生成タスクの場合でもexd_tskからはリターンせずに
*      次のタスク(またはアイドル状態)に遷移します。
*
*   <errors>
*     E_SYS    システムエラー
*                             ・カーネルの誤動作
*     E_CTX    コンテキストエラー
*                             ・非タスクコンテキストからの呼出し
*
*/
  • exd_tsk() を使用するためにはビルドするアプリケーションで以下のプロパティを設定し、動的生成機能拡張パッケージを有効にしてビルドしてください。

LibDynamicCreate <- 'true' (有効)

割込み及び例外の処理

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]

ミューテックスのロック解除順序

SOLID-OSでは unl_mtx() でミューテックス解除を行う場合にロックした順番と逆順となっていなくてもエラーとはなりません。(新世代カーネル仕様と同等の動作。第3世代カーネル仕様では E_OBJ エラー)


割り込み操作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の場合はキューイングを行わない動作)

キューイング数を設定するにはアプリケーションの kernel_cfg.c 内で起動要求キューイング数/起床要求キューイング数の設定(optional)を参考に記述してください。


非タスクコンテキストからの clr_flg() を呼び出した場合の動作

SOLID-OSでは非タスクコンテキストから clr_flg() を呼び出した場合、タスクコンテキストから呼び出した場合と同等の動作をします。(第3世代カーネル仕様では E_CTX エラー)


イベントフラグ待ち解除時のクリア方法指定

イベントフラグがセットされ、待ち状態にあったタスクの待ち状態が解除される際にフラグのビットパターンのビットをクリアする方法を以下の中から選択可能です。

  • 指定なし(クリアしない)

  • すべてのビットをクリア

  • 待ち対象のビットのみクリア

待ち対象のビットのみクリアする場合はイベントフラグ待ちAPI (wai_flg()/pol_flg()/twai_flg()) の待ちビットパターンパラメータ waiptn でセットされているビットがすべてクリアされます。それ以外のビットは変化しません。

クリア方法の指定は資源生成時の属性とイベントフラグ待ちAPI (wai_flg()/pol_flg()/twai_flg()) の待ちモードパラメータ 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ではカーネル初期化・終了時に呼び出されるユーザ関数の実装方法がバージョンにより異なります。

  1. 3.3.0以前: kernel_cfg.c_kernel_call_inirtn()/_kernel_call_terrtn() 関数の中にユーザーの実装関数の呼出を記述

  2. 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をコールするとアサーションに失敗してアボートします

  • 生成時に 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_PRI, 最高優先度)

    • 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をコールするとアサーションに失敗してアボートします

  • 生成時に 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_PRI, 最高優先度)

    • 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 内)