概要
型
戻り値
メモリー管理
ジョブ管理
タスク管理
例外管理
割り込み管理
ミューテックス
条件変数
リモートプロシジャーコール
タイマー管理
その他
索引
MPL カーネルの機能を利用するには kc_〜 で定義される C 言語の関数を呼び出します(カーネルコール)。
必要なファイルは kc.h (mpltype.h, cputype.h) と kc.a です。
以降でカーネルコールに必要な型及び、個々の関数を説明します。
MPL で定義される型を以下に記述します。
型名 | : | 内容 |
byte | : | 8bit 符号無し整数 |
word16 | : | 16bit 符号無し整数 |
word32 | : | 32bit 符号無し整数 |
word | : |
処理系依存の符号無し整数 以下の条件を満たす
|
numeric | : |
処理系依存の符号付き整数 以下の条件を満たす
|
tas_flg | : | kc_tas_try で利用するフラグ |
RESULT | : | カーネルコールの結果 |
HANDLE | : | カーネル資源のハンドル |
HJOB | : | ジョブハンドル |
HTSK | : | タスクハンドル |
HMTX | : | ミューテックスハンドル |
HCND | : | 条件変数ハンドル |
HRPC | : | RPC ハンドル |
標準的なカーネルコールの戻り値 (RESULT 型) を以下に記述します。
定数 | : | 値 | : | 意味 |
RC_SUCCESS | : | 0 | : | 正常終了 |
RC_FAIL | : | 1 | : | 異常終了 |
RC_INVALIDATE_ARG | : | 2 | : | 不正な引数 |
RC_INVALIDATE_HANDLE | : | 3 | : | 不正なハンドル |
RC_RIGHTLESS | : | 4 | : | 権利の無い引数・操作 |
RC_JOB_ABORTED | : | 5 | : | job が戻り値を持たない |
RC_JOB_INVALIDATE_PTR | : | 6 | : | wait 中にポインターが無効になった |
RC_MTX_BROKEN | : | 7 | : | 壊れたミューテックス |
RC_RPC_BROKEN | : | 8 | : | reply した rpc は破棄 |
RC_FATAL | : | -1 | : | システムエラー |
RC_RESOURCE_POOR | : | -2 | : | システムリソース不足 |
RC_LIMIT_OVER | : | -3 | : | システム制限値オーバー |
RC_RESERVED | : | -4 | : | 使用中 |
kc_ram で始まるカーネルコールはメモリー管理機能を提供します。
メモリーはページ単位で管理します。
具体的な 1 ページのサイズはシステムによって異なるので kc_ram_info で取得してください。
word | page_cnt | : | 確保したいページ数 |
0 以外 | : | 確保したメモリーブロック |
0 | : | 失敗 |
メモリーブロックを確保します。
void* | mem | : | 解放したいメモリーブロック |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なメモリーブロックを指定した |
メモリーブロックを解放します。
kc_ram_share により参照数が 2 以上だった場合は参照数が減るだけでメモリーブロックは開放されません。
参照数が 0 になった時に実際の解放をします。
kc_rpc_request に丸ごと渡している場合も同様で、RPC リクエストが終了するまでは解放されません。
void* | mem | : | 共有したいメモリーブロック |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | メモリーブロックを指定した |
RC_RESOURCE_POOR | : | メモリー不足で実行できなかった |
RC_LIMIT_OVER | : | 参照数カウンター不足で実行できなかった |
メモリーブロックの参照数を増加します。
kc_ram_alloc で確保された直後の参照数は 1 です。
メモリーブロックは参照数の数だけ kc_ram_free を呼び出さないと開放されません。
void* | mem | : | 特定メモリーブロックのページ数を知りたい場合に指定 |
RAMINFO* | tips | : | 情報を受け取るアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
メモリーの情報を取得します。
内容は以下の通りです。
typedef struct { word page_size ; word page_cnt ; word free_cnt ; word system_used ; } RAMINFO ;
word | page_size | : | 1 ページのサイズ (bytes) |
word | page_cnt | : | システムの全ページ数 ※もしくは mem で指定したメモリーブロックのページ数 |
word | free_cnt | : | システムの空きページ数 |
word | system_used | : | OSの利用バイト数 |
X68000 の場合、page_size=4096 です。
kc_job で始まるカーネルコールはジョブ管理機能を提供します。
ジョブとは一般で言うところのプロセスに相当するもので、複数のタスクをまとめた単位です。
カーネル資源の内、「タスク」と「権利」はジョブ毎に管理します。
またジョブにはいくつかの状態があり、作成から削除まで順次変わっていきます。
ジョブには 実行前・実行中・ゾンビ状態・死亡状態 の 4 つの状態があり、段階的に変化します。
内容は以下の通りです。
状態 | 内容 | ||||||
---|---|---|---|---|---|---|---|
実行前 |
kc_job_createで作成した直後の状態です。 kc_job_start を呼び出すと実行中になります。 |
||||||
実行中 |
kc_job_startで動作させた状態です。 全ての保持タスクが終了するかkc_job_stopでジョブを終了させると以下の状態になります。
|
||||||
ゾンビ状態 |
JOB_STATE_LSYNC, JOB_STATE_GSYNC のジョブが終了し kc_job_wait が呼び出されていない状態です。 kc_job_wait でハンドルを取得すると死亡状態になります。 |
||||||
死亡状態 |
JOB_STATE_LSYNC, JOB_STATE_GSYNC のジョブに対して kc_job_wait でハンドルを取得した後の状態です。 kc_job_delete でジョブを削除して、後始末をする必要があります。 |
ジョブは「カーネルコールの呼び出し許可」と「指定可能な実行優先度」の2つの権利を保持します。
「指定可能な実行優先度」はそのジョブが作成するジョブ及びタスクに対して、「カーネルコールの呼び出し許可」は加えてそのジョブ自身に影響を与えます。
これらの設定は 32bit のフラグで表現され、 kc_job_create 実行時に指定します。
カーネルコールの呼び出し許可では、個々のカーネルコールに対して使用許可/禁止を定義します。
実際はフラグの数が足りないので複数のカーネルコールをグループ化して扱います。
グループは以下の通りで、各々が permit パラメータ中の 1bit で許可/禁止を示します。
許可したい(=禁止したくない)項目全てを or で合成した値が設定値になります。
フラグの下位 3bit は指定可能な実行優先度用の領域です。
詳細は後述します。
定数 | 内容 |
---|---|
PERMIT_CLC | kc_clc を許可 |
PERMIT_RAM | kc_ram を許可 (※ kc_ram_share は別途 PERMIT_RAM_SHARE も必要) |
PERMIT_RAM_SHARE | kc_ram_share を許可 (※別途 PERMIT_RAM も必要) |
PERMIT_JOB | kc_job_exit を除いた kc_job を許可 |
PERMIT_TSK | kc_tsk_delete を除いた kc_tsk を許可 (※ 特権モードで動作させるには別途 PERMIT_TSKK も必要) |
PERMIT_TSKK | kc_tsk_create で特権モードの指定を許可 (※ 別途 PERMIT_TSK も必要) |
PERMIT_EXC | kc_exc の許可 |
PERMIT_INT | kc_int の許可 (※ kc_int_map は別途 PERMIT_INT_MAP も必要) |
PERMIT_INT_MAP | kc_int_map の許可 (※ 別途 PERMIT_INT も必要) |
PERMIT_MTX_CREATE | kc_mtx_create, kc_mtx_delete の許可 |
PERMIT_MTX_ACCESS | kc_mtx_lock, kc_mtx_unlock の許可 |
PERMIT_CND_CREATE | kc_cnd_create, kc_cnd_delete の許可 |
PERMIT_CND_ACCESS | kc_cnd_raise, kc_cnd_wait の許可 |
PERMIT_RPC | kc_rpc の許可 |
PERMIT_ALL | 未定義分も含めて完全な許可 |
実行優先度の上限の設定は、0 〜 7 の数値で指定します。
数値の意味は kc_tsk_create の実行優先度を参照してください。
この値は前述した 32bit のフラグの下位 3bit を使って指定します。
禁止されているカーネルコールを呼び出したり、
禁止されている実行優先度のタスクを作ろうとすると、
例外 EXC_KERNELCALL_FAULT が発生します。
word32 | permit | : | 有効な権利のビットデータ |
word16 | type | : | 同期タイプ |
0 以外 | : | 作成したジョブのハンドル |
0 | : | 失敗 |
ジョブを作成します。
有効な権利のビットデータは「カーネルコールの呼び出し許可」と「指定可能な実行優先度」を組み合わせた値です。
新しいジョブに与えられる権利は、kc_job_create を呼び出すジョブが持っている権利から permit で許可されなかった権利を減らしたものになり、呼び出すジョブが持っている以上の権利は与えられません。
具体的な使用例は以下の通りです。
今の権利からタイマー機能を禁止し、かつ設定可能な実行優先度の上限を PRIORITY_TS にしたい場合は、 PERMIT_ALL&~PERMIT_CLC)|PRIORITY_TS を指定します。
カーネルコールだけを禁止する場合は PERMIT_ALL&~PERMIT_CLC 、
実行優先度の上限を下げるだけの場合は PERMIT_ALL|PRIORITY_TS です。
また同期タイプは以下の通りです。
定数 | 値 | 動作 | 説明 |
---|---|---|---|
JOB_TYPE_ASYNC | 0 | 非同期 | 終了時に自動で削除される |
JOB_TYPE_LSYNC | 1 | ローカル同期 | kc_job_wait(hjob)で同期する |
JOB_TYPE_GSYNC | 2 | グローバル同期 | kc_job_wait(0)で同期する |
ジョブは作成しただけでは機能しません。
kc_job_start で最初のタスクを実行してください。
MPL OS では、この命令は使用できません。
HJOB | hjob | : | 削除するジョブ |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なジョブを指定した |
RC_RIGHTLESS | : | 不適当な状態で実行した |
ジョブを削除します。
実行中のジョブ及びゾンビ状態のジョブに対しては実行すると RC_RIGHTLESS でエラー終了します。
MPL OS では、この命令は使用できません。
HJOB | hjob | : | 実行開始するジョブ |
void* | func | : | プログラムコードの開始アドレス |
word | stack | : | スタックサイズ (pages) |
word | level | : | 実行優先度 |
void* | param | : | パラメータ |
0 以外 | : | 作成したタスクのハンドル |
0 | : | 失敗 |
タスクを 1 つ作成してジョブを開始します。
引数の func, stack level, param は kc_tsk_create に対する引数です。
実行前のジョブ以外に対して実行するとエラー終了します。
MPL OS では、この命令は使用できません。
HJOB | hjob | : | 終了させるジョブ |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なジョブを指定した |
RC_RIGHTLESS | : | 不適当な状態で実行した |
ジョブを終了します。
JOB_TYPE_ASYNC のジョブは削除されます。
JOB_TYPE_LSYNC, JOB_TYPE_GSYNC のジョブは kc_job_wait で待たれていた場合は、待っているタスクを実行可能してから死亡状態になり、それ以外の場合はゾンビ状態になります。
実行中以外のジョブに対して実行すると RC_RIGHTLESS でエラー終了します。
MPL OS では、自分自身以外のジョブは終了できません。
HJOB | hjob | : | 終了を待つジョブ |
0 以外 | : | 死亡状態のジョブのハンドル |
0 | : | ゾンビ状態のジョブは無い / 失敗 |
指定したジョブがゾンビ状態になるのを待ちます。
この関数で取得したジョブは死亡状態になります。
HJOB に 0 を指定すると JOB_TYPE_GSYNC のジョブ全般を、0 以外を指定すると指定した JOB_TYPE_LSYNC のジョブを待ちます。
死亡状態のジョブに対して実行するとエラー終了します。
0 も含めて 1 つの HJOB に対して 1 つのタスクしか kc_job_wait を実行できません。
他のタスクが kc_job_wait を呼び出して待機状態になっている時に呼び出すとエラー終了します。
MPL OS では、この命令は使用できません。
HJOB | htsk | : | 情報を取得したいジョブ |
JOBINFO* | tips | : | 情報を受け取るアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なジョブを指定した |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
ジョブに付いての情報を取得します。
内容は以下の通りです。
typedef struct { HJOB hjob ; word16 type ; word16 status ; word32 permit ; word tsk_cnt ; word sys_job_cnt ; word sys_free_job_cnt ; } JOBINFO ;
HJOB | hjob | : | ジョブのハンドル | ||||||||||||
word16 | type | : |
| ||||||||||||
word16 | status | : |
| ||||||||||||
word32 | permit | : | ジョブの権利 | ||||||||||||
word | tsk_cnt | : | ジョブに属するタスクの数 | ||||||||||||
word | sys_job_cnt | : | システムに存在するジョブの数 | ||||||||||||
word | sys_free_job_cnt | : | システムに存在する空きジョブ・キャッシュの数 |
また hjob に 0 を指定すると、自分自身の情報を取得します。
MPL OS では、この命令は使用できません。
kc_tsk で始まるカーネルコールはタスク制御機能を提供します。
タスクとは一般で言うところのスレッドに相当するものでマルチプログラミングの基本単位です。
カーネル資源の内、割り込み・例外処理・ RPC はタスクに付随します。
タスクは実行優先度を持っており、現在実行中のタスクよりも高い優先度を持ったタスクが実行可能になると、そちらに実行が切り替わります。
あるタスクが実行できるのは、そのタスクが実行可能でかつ、そのタスクよりも高い実行優先度を持ったタスク全てが実行可能でない場合だけです。
実行優先度は 8 段階有り基本的には固定ですが、優先度の継承や一部の優先度で働くタイムシェアリング処理で変動します。
void* | func | : | プログラムコードの開始アドレス |
word | stack | : | スタックサイズ (pages) |
word | level | : | 実行優先度 |
word | mode | : | 動作モード |
void* | param | : | タスクに渡すパラメータ |
0 以外 | : | 作成したタスクのハンドル |
0 | : | 失敗 |
タスクを作成します。
作成したタスクは kc_tsk_create を呼び出したタスクと同じジョブに所属し、
ただちに実行可能状態になります。
プログラムコードはタスクとして実行する関数のアドレスです。
スタック領域としてスタックサイズで指定したページ数のメモリーを新たに確保します。
スタックサイズに 0 を指定すると、サイズをシステムに任せます(現状では 1 ページになります)
動作モードに 0 以外を指定すると特権モードで動作します。
タスクに渡すパラメータは、そのままタスク関数のパラメータとして渡されます。
実行優先度は以下の通りで値が小さいほど優先度が高くなります。
定数 | 値 | 動作 | 想定している主な用途 |
---|---|---|---|
PRIORITY_DEV | 0 | FIFO | タイミングの厳しい I/O 操作 |
PRIORITY_SYS | 1 | RR | NMI 等のシステム処理 |
PRIORITY_RTH | 2 | RR | 優先処理(高) |
PRIORITY_RTM | 3 | RR | 優先処理(中) |
PRIORITY_RTL | 4 | RR | 優先処理(低) |
PRIORITY_TSH | 5 | TS | 通常処理 |
PRIORITY_TSL | 6 | TS | 通常処理 |
PRIORITY_BG | 7 | RR | バックグラウンド処理 |
PRIORITY_TS | 5 | TS | 標準的な処理の優先度 |
PRIORITY_RT | 4 | RR | 標準的な優先処理の優先度 |
FIFO | : | ファーストイン・ファーストアウト | : | タスクが待機状態になるか、自主的に実行権を手放さない限り、タスクスイッチしない |
RR | : | ラウンドロビン | : | タスクが一定時間動作を続けると強制的にタスクスイッチする |
TS | : | タイムシェアリング | : | 基本は RR と同じだが、動作状態により優先度が上下する |
基本的に実行優先度は固定で、開始時の設定から変わりませんが、以下の例外があります。
特権モードとはハードウェア資源や、場合によってはカーネルの情報も含めた全ての物理メモリーにアクセスできる状態です。
通常はデバイスドライバーを動作させるために利用します。
特権モードのタスクが意図的/不具合により望まれない動作をするとシステムに重大な影響を与えるので、
使用には細心の注意が必要です。
MPL OS では、PRIORITY_DEV と PRIORITY_SYS をシステム予約にし、特権モードの使用も禁止したいのですが、十分な対応ができないのでユーザーに解放しています。
HTSK | htsk | :削除するタスク |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なジョブを指定した |
RC_RIGHTLESS | : | 不適当な状態で実行した |
タスクを削除します。
自分自身か自分と同じジョブに所属するタスクにしか実行できません。
それ以外のタスクに対して実行すると RC_RIGHTLESS でエラー終了します。
また htsk に 0 を指定すると自分自身を削除します。
タスクを削除すると割り当てられていたスタックメモリーが解放されます。
もしタスクがミューテックスをロックしていた場合、そのミューテックスは壊れます。
また RPC リクエスト中だった場合は kc_rpc_reply を呼ばれるまでリクエストだけが残ります。
有りません |
有りません |
タスクの実行権を放棄します。
タスクが再スケジューリングされ、実行待ちをしていたタスクに処理が移ります。
実行待ちをしているタスクが無い場合は、再び自分自身がスケジューリングされます。
HTSK | htsk | : | 情報を取得したいタスク |
TSKINFO* | tips | : | 情報を受け取るアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なタスクを指定した |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
タスクに付いての情報を取得します。
内容は以下の通りです。
typedef struct { HTSK htsk ; HJOB hjob ; word std_level ; word run_level ; word* tls ; word sys_tsk_cnt ; word sys_free_tsk_cnt ; } TSKINFO ;
HTSK | htsk | : | タスクのハンドル |
HJOB | hjob | : | タスクの所属するジョブのハンドル |
word | std_level | : | 標準の実行優先度 |
word | run_level | : | 現在の実行優先度 |
word* | tls | : | タスクローカルストレージのアドレス |
word | sys_tsk_cnt | : | システムに存在するタスクの数 |
word | sys_free_tsk_cnt | : | システムに存在する空きタスク・キャッシュの数 |
指定できるタスクは同じジョブに所属するものだけです。
また htsk に 0 を指定すると、自分自身の情報を取得します。
タスクローカルストレージはタスク固有の記録領域ですが、word データを1つしか記録できません。
より多くのデータで利用する場合はマネージメントライブラリーを作成し、ライブラリー経由で利用してください。
kc_exc で始まるカーネルコールは例外処理機能を提供します。
例外とはプログラムが異常な動作をした事を通知するしくみで、通常は関数の戻り値等では渡せないエラーを通知するために使います。
例外には以下の種類があります。
定数 | 内容 |
---|---|
EXC_DOUBLE_FAULT | 例外処理中に同じ例外が発生すると発生 |
EXC_INSTRUCTION_FAULT | 許可されていない CPU 命令を呼び出すと発生 |
EXC_ADDRESS_FAULT | 許可されていないメモリー (アドレスを/形式で) アクセスすると発生 |
EXC_STACK_FAULT | スタックオーバーランで発生 |
EXC_MATH_FAULT | 0 除算等で発生 |
EXC_PROTECTION_FAULT | 使用を許可されていないハードウェア資源にアクセスすると発生 |
EXC_KERNELCALL_FAULT | 存在しないカーネルコールや、使用を許可されていないカーネルコールを呼び出すと発生 |
例外を起こしたタスクは通常は強制終了させられますが、
場合によっては kc_exc_root や kc_exc_trap を呼び出す事で、対応処理を実行し処理を継続できます。
X68000 の場合、期待される形での EXC_STACK_FAULT は発生しません。
EXC_ADDRESS_FAULT も NULL ポインター及び I/O アクセス以外の不正なメモリーアクセスが原因では発生しません。
void* | func | : | 例外ハンドラーのアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
ジョブに対して例外ハンドラーを登録・登録解除します。
全ての例外に対する共通ハンドラーを登録します。
NULL を指定した場合は例外ハンドラーを解除します。
登録したハンドラーは同じジョブに所属する全てのタスクで共有します。
タスク毎に個別のハンドラーを設定したい場合は kc_exc_trap を利用してください。
kc_exc_root と kc_exc_trap の両方でハンドラーを登録している場合、kc_exc_trap のハンドラーが優先され、kc_exc_root のハンドラーは呼び出されません。
例外処理やハンドラーに付いての詳細は kc_exc_trap を参照してください。
word32 | excbit | : | 例外ハンドラーを設定する例外 |
void* | func | : | 例外ハンドラーのアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正な例外/アドレスを指定した |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
タスクに対して例外ハンドラーを登録・登録解除します。
excbit に複数の例外を指定した場合、それら全てに対して処理を実行します。
NULL を指定した場合は例外ハンドラーを解除します。
例外ハンドラーを登録すると、対応する例外が発生した時に例外ハンドラーにジャンプします。
そして例外ハンドラーの関数を終了した後で、もとの処理を継続します。
ただし環境によっては正常に継続できない場合もあります。
また EXC_DOUBLE_FAULT が多重発生した場合はタスクを強制削除します。
例外ハンドラーの実行中は、その例外及び優先度の低い例外は一時的にマスクされますが、
優先度の高い例外には通常通り処理されます。
例外ハンドラーの引数は以下の通りです。
word32 | excbit | : | 発生した例外 |
void* | pc | : | プログラム・カウンターの値 |
void* | sp | : | スタック・ポインターの値 |
word | info1 | : | 拡張情報 1 |
word | info2 | : | 拡張情報 2 |
拡張情報は例外の種類毎に個別の追加情報が設定されます。
内容は以下の通りです。
例外 | 拡張情報 1 | 拡張情報 2 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
EXC_DOUBLE_FAULT | 0 | 0 | ||||||||||
EXC_INSTRUCTION_FAULT | 0 | 0 | ||||||||||
EXC_ADDRESS_FAULT |
| 問題のアドレス | ||||||||||
EXC_STACK_FAULT | 0 | 0 | ||||||||||
EXC_MATH_FAULT |
| 0 | ||||||||||
EXC_PROTECTION_FAULT |
| 0 | ||||||||||
EXC_KERNELCALL_FAULT | 0 | カーネルコール番号 |
X68000 の場合、以下のサブタイプは発生しまん。
EXC_ADDRESS_IO
EXC_MATH_UNDERFLOW
EXC_MATH_FPU
EXC_PROTECTION_INSTRUCTION
EXC_PROTECTION_ADDRESS
EXC_PROTECTION_IO
また EXC_STACK_FAULT は chk 命令に、 EXC_MATH_OVERFLOW は trapv 命令に割り当てられています。
kc_int で始まるカーネル・コールは割り込み機能を提供します。
MPL カーネルは各タスク毎に 8 個の割り込みを提供します(INT_1 〜 INT_8)。
これらは INT_1 を最高優先度とする 8 レベルの割り込みになっており、
タスクは割り込みの発生を待ったり、自分で登録した割り込みハンドラーを実行したりできます。
HTSK | htsk | : | 割り込みを発生させるタスク |
word32 | intbit | : | 発生させる割り込み |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なタスクを指定した |
RC_INVALIDATE_ARG | : | 不正な割り込みを指定した |
RC_RIGHTLESS | : | 不適当な状態で実行した |
タスクに対して割り込みを発生させます。
htsk に 0 を指定した場合は自分自身を指定した事になります。
自分と同じジョブに所属していないタスクを指定した場合は RC_RIGHTLESS でエラー終了します。
発生させたい割り込みに対応するビットを 1 にしたビットデータを指定してください。
複数の割り込みを同時に指定する事も可能です。
使用するのは下位 8bit で、定数 INT_1 〜 INT_8 に定義してあります。
また INT_ALL として全ての割り込みビットを ON にした値を定義してあります。
既に発生中の割り込みを指定した場合、その部分は無視されます。
word32 | intbit | : | 割り込みハンドラーを設定する割り込み |
void* | func | : | 割り込みハンドラーのアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正な割り込み/アドレスを指定した |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
割り込みハンドラーを登録・登録解除します。
intbit に複数の割り込みを指定した場合、それら全てに対して処理を実行します。
NULL を指定した場合は割り込みハンドラーを解除します。
割り込みハンドラーを登録すると、対応する割り込みが発生した時に割り込みハンドラーにジャンプします。
そして割り込みハンドラーの関数を終了した後で、もとの処理を継続します。
ただし、割り込み発生時にタスクが kc_int_wait 以外の理由で待機状態だった場合は、
そのまま待機状態を継続し、実行可能になった後でジャンプします。
割り込みハンドラーの実行中は、その割り込み及び優先度の低い割り込みは一時的にマスクされますが、
優先度の高い割り込みには通常通り処理されます。
word32 | mask | : | 設定したい割り込みマスク |
word32* | org_mask | : | 設定前の割り込みマスクを受け取る領域を指すポインタ |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正な割り込み/アドレスを指定した |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
割り込みマスクを設定します。
org_mask にアドレスを指定すれば、既存の割り込みマスクを取得できます。
割り込みマスクは有効にしたい割り込みに対応するビットを 1 にしたビットデータです。
無効にされた割り込みが発生した場合、その割り込みは有効にされるまで保留されます。
この状態でさらに同じ割り込みが発生した場合は、通常と同様に無視されます。
word32 | mask | : | 待機する割り込み |
word32* | org_mask | : | 待機前の割り込みマスクを受け取る領域を指すポインタ |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正な割り込み/アドレスを指定した |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
タスクを待機状態にして割り込みの発生を待ちます。
待ちに入る前に割り込みマスクを設定し、指定した割り込みのみを待てます。
また複数の割り込みを同時に待つことも可能です。
org_mask にアドレスを指定すれば、既存の割り込みマスクを取得できます。
指定した割り込みの内のどれかが発生するとタスクは実行を再開します。
この際、どの割り込みが発生したかを取得する事はできません。
発生した割り込みを識別したい場合は、個別に割り込みハンドラーを登録したうえで、ハンドラー内で kc_int_info を実行してください。
word | id | : | 対応付けしたいハードウェア割り込みの ID |
word32 | mask | : | 対応付けしたい割り込み |
RC_SUCCESS | : | 成功 |
RC_RIGHTLESS | : | 許可されていない対象を操作した |
RC_RESERVED | : | 他のタスクが取得している |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
ハードウェア割り込みをタスク割り込みに対応付けます。
ハードウェア割り込み発生時に指定したタスク割り込みが発生するようになります。
mask に 0 を指定すると対応付けを解除します。
ハードウェア割り込みはプラットフォーム固有に定義されます。
具体的に指定できる ID と、その内容に付いてはプラットフォームの説明を参照してください。
要求したハードウェア割り込みが他のタスクに取得されている場合は RC_RESERVED でエラー終了します。
対応付けが許可されていない割り込みを対応付けしようとしたり、自分で対応付けしていない割り込みを解放しようとした場合は RC_RIGHTLESS でエラー終了します。
X68000 の場合、は割り込みベクターの 31 と 64-107 が対応しています。
割り込み ID はベクター番号をそのまま指定してください。
INTINFO* | tips | : | 情報を受け取るアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
割り込みの情報を取得します。
内容は以下の通りです。
typedef struct { word execute_intr ; } INTINFO ;
word | execute_intr | : | 現在ハンドラーを実行中の割り込み |
複数の割り込みハンドラーを実行中の場合は、現在アクティブ(最も優先度が高い)割り込みが設定されます。
kc_mtx で始まるカーネル・コールはミューテックスを提供します。
これは複数のタスクで同じ資源を利用する際に発生する、コンフリクトを避けるための排他機構です。
ミューテックスは再入可能です。
また、実行優先度を継承します。
有りません |
0 以外 | : | 作成したミューテックスのハンドル |
0 | : | 失敗 |
ミューテックスを作成します。
HMTX | hmtx | : | 削除するミューテックス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なミューテックスを指定した |
RC_MTX_BROKEN | : | ミューテックスが壊れている |
RC_RESERVED | : | 他のタスクがロックしている |
ミューテックスを削除します。
削除したミューテックスを kc_mtx_lock で待っていたタスクには RC_FAIL が戻ります。
削除したミューテックスが壊れていた場合は RC_MTX_BROKEN を戻します。
他のタスクがロックしている場合は RC_RESERVED でエラー終了します。
HMTX | hmtx | : | ロックするミューテックス |
word | nowait | : | ロックできなかった時の動作を指定するフラグ |
RC_SUCCESS | : | 成功 |
RC_RESERVED | : | 他のタスクがロックしているのでロックできなかった |
RC_LIMIT_OVER | : | 多重ロック回数が限界値を超えたのでロックできなかった |
RC_MTX_BROKEN | : | ミューテックスが壊れている |
RC_FAIL | : | ミューテックスが削除された |
ミューテックスをロックします。
既に他のタスクがロックしている場合は待機状態になり、他の処理を実行する事はできません。
ただし、引数 nowait に 0 以外の値を指定した場合は、
待機状態にならずに、戻り値 RC_RESERVED を戻します。
この場合、ミューテックスはロックしません。
nowait に 0 を指定した場合、
現在ミューテックスをロックしているタスクの実行優先度が
呼び出しタスクの実行優先度より低い場合は
呼び出しタスクの実行優先度がミューテックスをロックしているタスクに継承されます。
これは実行中のタスクがミューテックスを解放するまで継続します。
既に自分自身でロックしているミューテックスに対して再度ロックを試みた場合、
デッドロックせずにそのままロック状態を継続します。
この場合、内部的にはロックした回数をカウントしており、
同じ回数だけ kc_mtx_unlock を呼び出さなければ解放しません。
またロック回数のカウンターがオーバーフローした場合はロック回数を増やさずに戻り値 RC_LIMIT_OVER を戻します。
ミューテックスをロックしたタスクが解放しないまま終了した場合、そのミューテックスは壊れます。
既にロック待ちしていたタスクは RC_MTX_BROKEN の戻り値を受け取り、新たなロック要求も全て RC_MTX_BROKEN で終了します。
壊れたミューテックスに対しては kc_mtx_delete しか実行できません。
HMTX | hmtx | : | 解放するミューテックス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なミューテックスを指定した |
RC_RIGHTLESS | : | 許可されていない対象を操作した |
ロックしているミューテックスを解放します。
自分がロックしていないミューテックスを解放しようとすると RC_RIGHTLESS でエラー終了します。
また多重ロックしている場合は同じ数だけ呼び出さなければ解放しません。
kc_cnd で始まるカーネル・コールは条件変数を提供します。
これはミューテックスと協調して資源が利用可能になるのを待つ同期機構です。
有りません |
0 以外 | : | 作成した条件変数のハンドル |
0 | : | 失敗 |
条件変数を作成します。
HCND | hcnd | : | 削除する条件変数 |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正な条件変数を指定した |
条件変数を削除します。
kc_cnd_wait で削除した条件変数を待っていたタスクには RC_FAIL が戻ります。
HCND | hcnd | : | 通知する条件変数 |
word | raisecnt | : | 起床させるタスクの数 |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正な条件変数を指定した |
条件変数を待っているタスクを起床します。
引数の raisecnt は起床するタスクの数を制限するための設定で、
この数よりも多くのタスクが条件変数を待っている場合、
タスクの実行優先度の高いものから順番に raisecnt 個のタスクのみが起床し、残りは待機状態を維持します。
また raisecnt に 0 を指定した場合は全てのタスクが起床します。
条件変数を待っているタスクが無い場合は何の効果も有りません。
HCND | hcnd | : | 待機する条件変数 |
HMTX | hmtx | : | 待機する時に解放するミューテックス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正な条件変数を指定した |
条件変数を待ちます。
呼び出しタスクは待機している条件が発生するまで待機状態になり、
他の処理を実行する事はできません。
引数の hmtx は待機に入ると同時に解放するミューテックスを指定します。
hmtx に 0 を指定した場合は特にミューテックスを操作しません。
kc_rpc で始まるカーネル・コールはタスク間通信機能を提供します。
これはタスク-タスク間の同期通信で 1 塊のバイナリーデータを送受信できます。
通信に利用するメモリーは kc_ram_alloc で確保したメモリーブロック全体です。
また kc_ram_share で共有しているメモリーブロックは利用できません。
HTSK | htsk | : | 要求先のタスクハンドル |
void* | msg | : | リクエストデータの格納されたメモリーブロックを指すポインタ |
word | size | : | リクエストデータのサイズ (bytes) |
戻り値は正常動作した場合は kc_rpc_reply で指定された値が戻ります。
以下は代表的な内容です。
RC_SUCCESS | : | 成功 ※1 |
RC_RPC_REJECT | : | メッセージは拒絶された ※1 |
RC_INVALIDATE_HANDLE | : | 不正なタスクを指定した ※2 |
RC_INVALIDATE_ARG | : | 不正なアドレス/サイズを指定した ※2 |
RC_RESOURCE_POOR | : | メモリー不足で実行できない ※2 |
※1 … 通常はこれらの利用を想定しています。
※2 … カーネルコール失敗時に使われる場合があります。
呼び出しタスクから別のタスクへ rpc を要求します。
呼び出しタスクは要求したリクエストが完了するまで待機状態になり、他の処理を実行する事はできません。
リクエストの内容はバイナリーデータとして扱い、カーネルは内容を関知しません。
送信側と受信側で予めフォーマットを決めておき、それにしたがって解釈してください。
応答が必要な場合はフォーマットの一部として応答を書き込む領域を用意してください。
msg に指定するポインタは kc_ram_alloc の戻り値として取得したポインタしか指定できません。
リクエストの処理中は size 指定によらず、msg で指定したメモリーブロック全体がメッセージデータとして扱われます。
処理中のメモリーブロックを不正規な手順で参照・操作すると問題が発生します。
void** | msg | : | リクエストデータのアドレスを受け取るポインタ |
word* | size | : | リクエストデータのサイズを受け取るポインタ |
0 以外 | : | 取得したリクエストのハンドル |
0 | : | 失敗 |
呼び出しタスクに対して要求されたリクエストを取得します。
呼び出しタスクはリクエストを受け取るまで待機状態になり、
他の処理を実行する事はできません。
リクエストの内容に付いては kc_rpc_request を参照してください。
リクエストが複数溜まっている場合は、基本的に要求された順に取り出しますが、
要求したタスクの実行優先度の高いものが優先的に取り出されます。
取得したリクエストは kc_rpc_accept を呼び出したタスクでしか扱えません。
また取得したリクエストの実行優先度が取得したタスクの実行優先度よりも高い場合、
取得したタスクにリクエストの実行優先度が継承され、実行優先度が引き上げられます。
これは後述するカーネル・コールを呼び出してリクエストを手放すまで継続します。
処理が終わったら kc_rpc_reply を呼び出して応答を返すか、kc_rpc_transfer を呼び出してリクエストを他のタスクに転送/譲渡してください。
HRPC | hrpc | : | 応答を返すリクエスト |
RESULT | rc | : | kc_rpc_request に渡す戻り値 |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なリクエストを指定した |
RC_RIGHTLESS | : | 許可されていない対象を操作した |
RC_RPC_BROKEN | : | リクエストが壊れている |
リクエストに対する処理を完了して応答を返します。
リクエストを要求したタスクは実行可能状態となり、再びスケジューリング対象になります。
自分が kc_rpc_accept したか、 kc_rpc_transfer によって受け取ったリクエスト以外を指定とすると RC_RIGHTLESS でエラー終了します。
reply したリクエストの要求元タスクが既に削除されていた場合は RC_RPC_BROKEN で終了します。
HRPC | hrpc | : | 応答を返すリクエスト |
HTSK | htsk | : | 転送/譲渡先のタスクハンドル |
word | direct | : | 転送/譲渡の指定 |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なリクエスト/タスクを指定した |
RC_RIGHTLESS | : | 許可されていない対象を操作した |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
取得したリクエストを実際に kc_rpc_accept を呼び出したタスクとは別のタスクで処理させたい場合に呼び出し、リクエストを他のタスクに転送/譲渡します。
direct に 0 を指定した場合は転送を、0 以外を指定した場合は譲渡になります。
転送した場合は転送先のタスクで再び kc_rpc_accept 〜の処理が必要ですが、譲渡の場合はそのままリクエストを再利用できます。
ただし譲渡できるタスクは同一ジョブ内に限られます。
自分が kc_rpc_accept したか、 kc_rpc_transfer によって受け取ったリクエスト以外を指定とすると RC_RIGHTLESS でエラー終了します。
また自分と同じジョブに所属していないタスクを指定して譲渡した場合も RC_RIGHTLESS でエラー終了します。
void** | msg | : | リクエストデータのアドレスを受け取るポインタ |
word* | size | : | リクエストデータのサイズを受け取るポインタ |
HRPC | hrpc | : | 0.待機前にリクエストへの応答をしない !0.応答を返すリクエスト |
HTSK | htsk | : | 0.応答処理 !0.転送/譲渡先のタスクハンドル |
word | direct | : | 転送/譲渡の指定 |
RESULT | rc | : | kc_rpc_request に渡す戻り値 |
0 以外 | : | 取得したリクエストのハンドル |
0 | : | 失敗 |
処理中のリクエストに対する応答(もしくは転送)処理と次のリクエストの取得を一括で処理します。
どの応答をするか(しないか)の選択は引数の内容で判断します。
HRPC | hrpc | : | 情報を取得したいリクエスト |
RPCINFO* | tips | : | 情報を受け取るアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_HANDLE | : | 不正なリクエストを指定した |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
RC_RIGHTLESS | : | 許可されていない対象を操作した |
RC_RPC_BROKEN | : | リクエストが壊れている |
リクエストに付いての情報を取得します。
内容は以下の通りです。
typedef struct { HTSK htsk_from ; HJOB hjob_from ; } RPCINFO ;
HTSK | htsk_from | : | リクエストを要求したタスクのハンドル |
HJOB | hjob_from | : | リクエストを要求したタスクのジョブハンドル |
自分が kc_rpc_accept したか、 kc_rpc_transfer によって受け取ったリクエスト以外を指定とすると RC_RIGHTLESS でエラー終了します。
リクエストの要求元タスクが既に削除されていた場合は RC_RPC_BROKEN で終了します。
kc_clc で始まるカーネル・コールはタイマーを提供します。
タイマーが扱う時間の単位は「チック」で、1 チックが実際にどれ位の時間かはシステムによって異なります。
具体的な設定値は kc_clc_info で取得してください。
word | timeout | : | タイムアウトまでのチック数 |
word | repeat | : | 周期タイムアウトの1周期分のチック数 |
word32 | intbit | : | 通知に使用する割り込みのビット |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正な割り込みを指定した |
RC_RESOURCE_POOR | : | メモリー不足で実行できない |
タイマーを設定し、タイムアウト時に割り込みを発生させます。
タイマーの設定方法は 4 種類あります。
timeout を指定し repeat を 0 にした場合は、timeout で指定したチック後に 1 回だけ割り込みが発生します。
timeout を 0 にして repeat を設定した場合は、repeat チック毎に繰り返し割り込みが発生します。
timeout, repeat 両方を 0 に設定した場合はタイマーを停止し、
timeout, repeat 両方に値を設定した場合は、初回は timeout、 2 回目以降は repeat で指定したチック毎に割り込みが発生します。
割り込みは kc_int_trap や kc_int_wait で受け取ってください。
使用できるタイマーはタスク毎に 1 つです。
1 つのタスクで複数のタイマーを使う事はできません。
CLCINFO* | tips | : | 情報を受け取るアドレス |
RC_SUCCESS | : | 成功 |
RC_INVALIDATE_ARG | : | 不正なアドレスを指定した |
タイマーの情報を取得します。
内容は以下の通りです。
typedef struct { word system_tick ; word us_per_tick ; word tick_per_slice ; } CLCINFO ;
word | system_tick | : | システム起動時から経過したチック数 |
word | us_per_tick | : | 1 チックの時間 (us単位) |
word | tick_per_slice | : | 1 スライスの時間 (チック単位) |
チックは OS が管理する時間の最小単位です。
1 チック毎にタイマー割り込みを処理し、スケジューリングやタイマーイベントを処理します。
スライスはタスクが連続で実行できる最大の時間で、この時間を越えて実行を続けようとした場合、OS により実行権を奪われます。
X68000 の場合、us_per_tick=4, tick_per_slice=5 です。
tas_flg | flg | : | テスト・アンド・セットの使用するフラグ領域を指すポインタ |
RC_SUCCESS | : | 確保成功 |
RC_FAIL | : | 確保失敗 |
いわゆる「テスト・アンド・セット」機能を実現します。
flg は 0 で初期化してから用いてください。
また、確保したフラグを解放する場合にも 0 を設定してください。
この機能は CPU 固有の対応命令をラップするもので、基本的には(カーネル・コールではない)単純な関数として実装されます。
CPU が対応する命令を持たない場合は別の方法で実装されたり、有効に機能しない場合があります。