カーネルコール リファレンス マニュアル

目次

概要

戻り値
メモリー管理
ジョブ管理
タスク管理
例外管理
割り込み管理
ミューテックス
条件変数
リモートプロシジャーコール
タイマー管理
その他
索引

概要

MPL カーネルの機能を利用するには kc_〜 で定義される C 言語の関数を呼び出します(カーネルコール)。
必要なファイルは kc.h (mpltype.h, cputype.h) と kc.a です。
以降でカーネルコールに必要な型及び、個々の関数を説明します。

MPL で定義される型を以下に記述します。

型名:内容
byte:8bit 符号無し整数
word16:16bit 符号無し整数
word32:32bit 符号無し整数
word: 処理系依存の符号無し整数
以下の条件を満たす
  • 全ての型のポインターと相互変換及び演算ができる
  • 可能な限り大きな数を扱える
  • 可能な限り CPU が無理なく操作できる
numeric: 処理系依存の符号付き整数
以下の条件を満たす
  • 全ての型のポインターの演算に使用できる
  • 可能な限り大きな数を扱える
  • 可能な限り CPU が無理なく操作できる
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 で取得してください。

void* kc_ram_alloc(word page_cnt)

引数
wordpage_cnt:確保したいページ数
戻り値
0 以外:確保したメモリーブロック
0:失敗
説明

メモリーブロックを確保します。

RESULT kc_ram_free(void* mem)

引数
void*mem:解放したいメモリーブロック
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なメモリーブロックを指定した
説明

メモリーブロックを解放します。

kc_ram_share により参照数が 2 以上だった場合は参照数が減るだけでメモリーブロックは開放されません。
参照数が 0 になった時に実際の解放をします。
kc_rpc_request に丸ごと渡している場合も同様で、RPC リクエストが終了するまでは解放されません。

RESULT kc_ram_share(void* mem)

引数
void*mem:共有したいメモリーブロック
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:メモリーブロックを指定した
RC_RESOURCE_POOR:メモリー不足で実行できなかった
RC_LIMIT_OVER:参照数カウンター不足で実行できなかった
説明

メモリーブロックの参照数を増加します。
kc_ram_alloc で確保された直後の参照数は 1 です。
メモリーブロックは参照数の数だけ kc_ram_free を呼び出さないと開放されません。

RESULT kc_ram_info(void* mem, RAMINFO* tips)

引数
void*mem:特定メモリーブロックのページ数を知りたい場合に指定
RAMINFO*tips:情報を受け取るアドレス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正なアドレスを指定した
説明

メモリーの情報を取得します。
内容は以下の通りです。

typedef struct {
    word page_size ;
    word page_cnt ;
    word free_cnt ;
    word system_used ;
} RAMINFO ;
	
wordpage_size:1 ページのサイズ (bytes)
wordpage_cnt:システムの全ページ数
※もしくは mem で指定したメモリーブロックのページ数
wordfree_cnt:システムの空きページ数
wordsystem_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 が呼ばれている場合死亡状態になる
JOB_STATE_LSYNC, JOB_STATE_GSYNC でなにも呼ばれていない場合ゾンビ状態になる
JOB_STATE_ASYNC の場合ジョブが削除される
ゾンビ状態 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_CLCkc_clc を許可
PERMIT_RAMkc_ram を許可 (※ kc_ram_share は別途 PERMIT_RAM_SHARE も必要)
PERMIT_RAM_SHAREkc_ram_share を許可 (※別途 PERMIT_RAM も必要)
PERMIT_JOBkc_job_exit を除いた kc_job を許可
PERMIT_TSKkc_tsk_delete を除いた kc_tsk を許可 (※ 特権モードで動作させるには別途 PERMIT_TSKK も必要)
PERMIT_TSKKkc_tsk_create で特権モードの指定を許可 (※ 別途 PERMIT_TSK も必要)
PERMIT_EXCkc_exc の許可
PERMIT_INTkc_int の許可 (※ kc_int_map は別途 PERMIT_INT_MAP も必要)
PERMIT_INT_MAPkc_int_map の許可 (※ 別途 PERMIT_INT も必要)
PERMIT_MTX_CREATEkc_mtx_create, kc_mtx_delete の許可
PERMIT_MTX_ACCESSkc_mtx_lock, kc_mtx_unlock の許可
PERMIT_CND_CREATEkc_cnd_create, kc_cnd_delete の許可
PERMIT_CND_ACCESSkc_cnd_raise, kc_cnd_wait の許可
PERMIT_RPCkc_rpc の許可
PERMIT_ALL未定義分も含めて完全な許可

実行優先度の上限の設定は、0 〜 7 の数値で指定します。
数値の意味は kc_tsk_create の実行優先度を参照してください。
この値は前述した 32bit のフラグの下位 3bit を使って指定します。

禁止されているカーネルコールを呼び出したり、 禁止されている実行優先度のタスクを作ろうとすると、 例外 EXC_KERNELCALL_FAULT が発生します。

HJOB kc_job_create(word32 permit, word16 type)

引数
word32permit:有効な権利のビットデータ
word16type:同期タイプ
戻り値
0 以外:作成したジョブのハンドル
0:失敗
説明

ジョブを作成します。

有効な権利のビットデータは「カーネルコールの呼び出し許可」と「指定可能な実行優先度」を組み合わせた値です。
新しいジョブに与えられる権利は、kc_job_create を呼び出すジョブが持っている権利から permit で許可されなかった権利を減らしたものになり、呼び出すジョブが持っている以上の権利は与えられません。

具体的な使用例は以下の通りです。
今の権利からタイマー機能を禁止し、かつ設定可能な実行優先度の上限を PRIORITY_TS にしたい場合は、 PERMIT_ALL&~PERMIT_CLC)|PRIORITY_TS を指定します。
カーネルコールだけを禁止する場合は PERMIT_ALL&~PERMIT_CLC 、
実行優先度の上限を下げるだけの場合は PERMIT_ALL|PRIORITY_TS です。

また同期タイプは以下の通りです。

定数動作説明
JOB_TYPE_ASYNC0非同期終了時に自動で削除される
JOB_TYPE_LSYNC1ローカル同期kc_job_wait(hjob)で同期する
JOB_TYPE_GSYNC2グローバル同期kc_job_wait(0)で同期する

ジョブは作成しただけでは機能しません。
kc_job_start で最初のタスクを実行してください。

MPL OS では、この命令は使用できません。

RESULT kc_job_delete(HJOB hjob)

引数
HJOBhjob:削除するジョブ
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なジョブを指定した
RC_RIGHTLESS:不適当な状態で実行した
説明

ジョブを削除します。

実行中のジョブ及びゾンビ状態のジョブに対しては実行すると RC_RIGHTLESS でエラー終了します。

MPL OS では、この命令は使用できません。

HTSK kc_job_start(HJOB hjob, void (*func)(void* param), word stack, word level, void* param)

引数
HJOBhjob:実行開始するジョブ
void*func:プログラムコードの開始アドレス
wordstack:スタックサイズ (pages)
wordlevel:実行優先度
void*param:パラメータ
戻り値
0 以外:作成したタスクのハンドル
0:失敗
説明

タスクを 1 つ作成してジョブを開始します。
引数の func, stack level, param は kc_tsk_create に対する引数です。

実行前のジョブ以外に対して実行するとエラー終了します。

MPL OS では、この命令は使用できません。

RESULT kc_job_stop(HJOB hjob)

引数
HJOBhjob:終了させるジョブ
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なジョブを指定した
RC_RIGHTLESS:不適当な状態で実行した
説明

ジョブを終了します。
JOB_TYPE_ASYNC のジョブは削除されます。
JOB_TYPE_LSYNC, JOB_TYPE_GSYNC のジョブは kc_job_wait で待たれていた場合は、待っているタスクを実行可能してから死亡状態になり、それ以外の場合はゾンビ状態になります。

実行中以外のジョブに対して実行すると RC_RIGHTLESS でエラー終了します。

MPL OS では、自分自身以外のジョブは終了できません。

HJOB kc_job_wait(HJOB hjob)

引数
HJOBhjob:終了を待つジョブ
戻り値
0 以外:死亡状態のジョブのハンドル
0:ゾンビ状態のジョブは無い / 失敗
説明

指定したジョブがゾンビ状態になるのを待ちます。
この関数で取得したジョブは死亡状態になります。

HJOB に 0 を指定すると JOB_TYPE_GSYNC のジョブ全般を、0 以外を指定すると指定した JOB_TYPE_LSYNC のジョブを待ちます。

死亡状態のジョブに対して実行するとエラー終了します。

0 も含めて 1 つの HJOB に対して 1 つのタスクしか kc_job_wait を実行できません。
他のタスクが kc_job_wait を呼び出して待機状態になっている時に呼び出すとエラー終了します。

MPL OS では、この命令は使用できません。

RESULT kc_job_info(HJOB hjob, JOBINFO* tips)

引数
HJOBhtsk:情報を取得したいジョブ
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 ;
	
HJOBhjob:ジョブのハンドル
word16type:
JOB_TYPE_ASYNC:終了時にゾンビ化せず削除されます
JOB_TYPE_LSYNC:終了時にゾンビ化し kc_job_wait(HJOB) を待ちます
JOB_TYPE_GSYNC:終了時にゾンビ化し kc_job_wait(0) を待ちます
word16status:
JOB_STATUS_STARTUP:実行前
JOB_STATUS_RUNNING:実行中
JOB_STATUS_ZOMBIE:ゾンビ状態
JOB_STATUS_DIE:死亡状態
word32permit:ジョブの権利
wordtsk_cnt:ジョブに属するタスクの数
wordsys_job_cnt:システムに存在するジョブの数
wordsys_free_job_cnt:システムに存在する空きジョブ・キャッシュの数

また hjob に 0 を指定すると、自分自身の情報を取得します。

MPL OS では、この命令は使用できません。

タスク管理

kc_tsk で始まるカーネルコールはタスク制御機能を提供します。
タスクとは一般で言うところのスレッドに相当するものでマルチプログラミングの基本単位です。
カーネル資源の内、割り込み例外処理RPC はタスクに付随します。

タスクは実行優先度を持っており、現在実行中のタスクよりも高い優先度を持ったタスクが実行可能になると、そちらに実行が切り替わります。
あるタスクが実行できるのは、そのタスクが実行可能でかつ、そのタスクよりも高い実行優先度を持ったタスク全てが実行可能でない場合だけです。
実行優先度は 8 段階有り基本的には固定ですが、優先度の継承や一部の優先度で働くタイムシェアリング処理で変動します。

HTSK kc_tsk_create(void (*func)(void* param), word stack, word level, word mode, void* param)

引数
void*func:プログラムコードの開始アドレス
wordstack:スタックサイズ (pages)
wordlevel:実行優先度
wordmode:動作モード
void*param:タスクに渡すパラメータ
戻り値
0 以外:作成したタスクのハンドル
0:失敗
説明

タスクを作成します。

作成したタスクは kc_tsk_create を呼び出したタスクと同じジョブに所属し、 ただちに実行可能状態になります。

プログラムコードはタスクとして実行する関数のアドレスです。
スタック領域としてスタックサイズで指定したページ数のメモリーを新たに確保します。
スタックサイズに 0 を指定すると、サイズをシステムに任せます(現状では 1 ページになります)
動作モードに 0 以外を指定すると特権モードで動作します。
タスクに渡すパラメータは、そのままタスク関数のパラメータとして渡されます。

実行優先度は以下の通りで値が小さいほど優先度が高くなります。

定数動作想定している主な用途
PRIORITY_DEV0FIFOタイミングの厳しい I/O 操作
PRIORITY_SYS1RRNMI 等のシステム処理
PRIORITY_RTH2RR優先処理(高)
PRIORITY_RTM3RR優先処理(中)
PRIORITY_RTL4RR優先処理(低)
PRIORITY_TSH5TS通常処理
PRIORITY_TSL6TS通常処理
PRIORITY_BG7RRバックグラウンド処理
PRIORITY_TS5TS標準的な処理の優先度
PRIORITY_RT4RR標準的な優先処理の優先度
FIFO:ファーストイン・ファーストアウト:タスクが待機状態になるか、自主的に実行権を手放さない限り、タスクスイッチしない
RR:ラウンドロビン:タスクが一定時間動作を続けると強制的にタスクスイッチする
TS:タイムシェアリング:基本は RR と同じだが、動作状態により優先度が上下する

基本的に実行優先度は固定で、開始時の設定から変わりませんが、以下の例外があります。

特権モードとはハードウェア資源や、場合によってはカーネルの情報も含めた全ての物理メモリーにアクセスできる状態です。
通常はデバイスドライバーを動作させるために利用します。
特権モードのタスクが意図的/不具合により望まれない動作をするとシステムに重大な影響を与えるので、 使用には細心の注意が必要です。

MPL OS では、PRIORITY_DEV と PRIORITY_SYS をシステム予約にし、特権モードの使用も禁止したいのですが、十分な対応ができないのでユーザーに解放しています。

RESULT kc_tsk_delete(HTSK htsk)

引数
HTSKhtsk:削除するタスク
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なジョブを指定した
RC_RIGHTLESS:不適当な状態で実行した
説明

タスクを削除します。

自分自身か自分と同じジョブに所属するタスクにしか実行できません。
それ以外のタスクに対して実行すると RC_RIGHTLESS でエラー終了します。
また htsk に 0 を指定すると自分自身を削除します。

タスクを削除すると割り当てられていたスタックメモリーが解放されます。
もしタスクがミューテックスをロックしていた場合、そのミューテックスは壊れます
また RPC リクエスト中だった場合は kc_rpc_reply を呼ばれるまでリクエストだけが残ります。

void kc_tsk_yield(void)

引数
有りません
戻り値
有りません
説明

タスクの実行権を放棄します。

タスクが再スケジューリングされ、実行待ちをしていたタスクに処理が移ります。
実行待ちをしているタスクが無い場合は、再び自分自身がスケジューリングされます。

RESULT kc_tsk_info(HTSK htsk, TSKINFO* tips)

引数
HTSKhtsk:情報を取得したいタスク
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 ;
	
HTSKhtsk:タスクのハンドル
HJOBhjob:タスクの所属するジョブのハンドル
wordstd_level:標準の実行優先度
wordrun_level:現在の実行優先度
word*tls:タスクローカルストレージのアドレス
wordsys_tsk_cnt:システムに存在するタスクの数
wordsys_free_tsk_cnt:システムに存在する空きタスク・キャッシュの数

指定できるタスクは同じジョブに所属するものだけです。
また htsk に 0 を指定すると、自分自身の情報を取得します。

タスクローカルストレージはタスク固有の記録領域ですが、word データを1つしか記録できません。
より多くのデータで利用する場合はマネージメントライブラリーを作成し、ライブラリー経由で利用してください。

例外管理

kc_exc で始まるカーネルコールは例外処理機能を提供します。
例外とはプログラムが異常な動作をした事を通知するしくみで、通常は関数の戻り値等では渡せないエラーを通知するために使います。
例外には以下の種類があります。

定数内容
EXC_DOUBLE_FAULT例外処理中に同じ例外が発生すると発生
EXC_INSTRUCTION_FAULT許可されていない CPU 命令を呼び出すと発生
EXC_ADDRESS_FAULT許可されていないメモリー (アドレスを/形式で) アクセスすると発生
EXC_STACK_FAULTスタックオーバーランで発生
EXC_MATH_FAULT0 除算等で発生
EXC_PROTECTION_FAULT使用を許可されていないハードウェア資源にアクセスすると発生
EXC_KERNELCALL_FAULT存在しないカーネルコールや、使用を許可されていないカーネルコールを呼び出すと発生

例外を起こしたタスクは通常は強制終了させられますが、 場合によっては kc_exc_rootkc_exc_trap を呼び出す事で、対応処理を実行し処理を継続できます。

X68000 の場合、期待される形での EXC_STACK_FAULT は発生しません。
EXC_ADDRESS_FAULT も NULL ポインター及び I/O アクセス以外の不正なメモリーアクセスが原因では発生しません。

RESULT kc_exc_root(void (*func)(word32 excbit, void* pc, void* sp, word info1, word info2))

引数
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 を参照してください。

RESULT kc_exc_trap(word32 excbit, void (*func)(word32 excbit, void* pc, void* sp, word info1, word info2))

引数
word32excbit:例外ハンドラーを設定する例外
void*func:例外ハンドラーのアドレス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正な例外/アドレスを指定した
RC_RESOURCE_POOR:メモリー不足で実行できない
説明

タスクに対して例外ハンドラーを登録・登録解除します。

excbit に複数の例外を指定した場合、それら全てに対して処理を実行します。
NULL を指定した場合は例外ハンドラーを解除します。

例外ハンドラーを登録すると、対応する例外が発生した時に例外ハンドラーにジャンプします。
そして例外ハンドラーの関数を終了した後で、もとの処理を継続します。
ただし環境によっては正常に継続できない場合もあります。
また EXC_DOUBLE_FAULT が多重発生した場合はタスクを強制削除します。

例外ハンドラーの実行中は、その例外及び優先度の低い例外は一時的にマスクされますが、 優先度の高い例外には通常通り処理されます。

例外ハンドラーの引数は以下の通りです。

word32excbit:発生した例外
void*pc:プログラム・カウンターの値
void*sp:スタック・ポインターの値
wordinfo1:拡張情報 1
wordinfo2:拡張情報 2

拡張情報は例外の種類毎に個別の追加情報が設定されます。
内容は以下の通りです。

例外 拡張情報 1 拡張情報 2
EXC_DOUBLE_FAULT 0 0
EXC_INSTRUCTION_FAULT 0 0
EXC_ADDRESS_FAULT
0分類不明
EXC_ADDRESS_BUSバスエラー
EXC_ADDRESS_SEGMENTセグメンテーションフォルト
EXC_ADDRESS_IOI/O エラー
問題のアドレス
EXC_STACK_FAULT 0 0
EXC_MATH_FAULT
0分類不明
EXC_MATH_DIV00 除算
EXC_MATH_OVERFLOWオーバーフロー
EXC_MATH_UNDERFLOWアンダーフロー
EXC_MATH_FPUFPU エラー
0
EXC_PROTECTION_FAULT
0分類不明
EXC_PROTECTION_INSTRUCTION保護された命令
EXC_PROTECTION_ADDRESS保護されたアドレス
EXC_PROTECTION_IO保護された I/O
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 レベルの割り込みになっており、 タスクは割り込みの発生を待ったり、自分で登録した割り込みハンドラーを実行したりできます。

RESULT kc_int_raise(HTSK htsk, word32 intbit)

引数
HTSKhtsk:割り込みを発生させるタスク
word32intbit:発生させる割り込み
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なタスクを指定した
RC_INVALIDATE_ARG:不正な割り込みを指定した
RC_RIGHTLESS:不適当な状態で実行した
説明

タスクに対して割り込みを発生させます。
htsk に 0 を指定した場合は自分自身を指定した事になります。
自分と同じジョブに所属していないタスクを指定した場合は RC_RIGHTLESS でエラー終了します。

発生させたい割り込みに対応するビットを 1 にしたビットデータを指定してください。
複数の割り込みを同時に指定する事も可能です。
使用するのは下位 8bit で、定数 INT_1 〜 INT_8 に定義してあります。
また INT_ALL として全ての割り込みビットを ON にした値を定義してあります。

既に発生中の割り込みを指定した場合、その部分は無視されます。

RESULT kc_int_trap(word32 intbit, void (*func)(void))

引数
word32intbit:割り込みハンドラーを設定する割り込み
void*func:割り込みハンドラーのアドレス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正な割り込み/アドレスを指定した
RC_RESOURCE_POOR:メモリー不足で実行できない
説明

割り込みハンドラーを登録・登録解除します。

intbit に複数の割り込みを指定した場合、それら全てに対して処理を実行します。
NULL を指定した場合は割り込みハンドラーを解除します。

割り込みハンドラーを登録すると、対応する割り込みが発生した時に割り込みハンドラーにジャンプします。
そして割り込みハンドラーの関数を終了した後で、もとの処理を継続します。
ただし、割り込み発生時にタスクが kc_int_wait 以外の理由で待機状態だった場合は、 そのまま待機状態を継続し、実行可能になった後でジャンプします。

割り込みハンドラーの実行中は、その割り込み及び優先度の低い割り込みは一時的にマスクされますが、 優先度の高い割り込みには通常通り処理されます。

RESULT kc_int_mask(word32 mask, word32* org_mask)

引数
word32mask:設定したい割り込みマスク
word32*org_mask:設定前の割り込みマスクを受け取る領域を指すポインタ
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正な割り込み/アドレスを指定した
RC_RESOURCE_POOR:メモリー不足で実行できない
説明

割り込みマスクを設定します。
org_mask にアドレスを指定すれば、既存の割り込みマスクを取得できます。

割り込みマスクは有効にしたい割り込みに対応するビットを 1 にしたビットデータです。
無効にされた割り込みが発生した場合、その割り込みは有効にされるまで保留されます。
この状態でさらに同じ割り込みが発生した場合は、通常と同様に無視されます。

RESULT kc_int_wait(word32 mask, word32* org_mask)

引数
word32mask:待機する割り込み
word32*org_mask:待機前の割り込みマスクを受け取る領域を指すポインタ
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正な割り込み/アドレスを指定した
RC_RESOURCE_POOR:メモリー不足で実行できない
説明

タスクを待機状態にして割り込みの発生を待ちます。
待ちに入る前に割り込みマスクを設定し、指定した割り込みのみを待てます。
また複数の割り込みを同時に待つことも可能です。
org_mask にアドレスを指定すれば、既存の割り込みマスクを取得できます。

指定した割り込みの内のどれかが発生するとタスクは実行を再開します。
この際、どの割り込みが発生したかを取得する事はできません。
発生した割り込みを識別したい場合は、個別に割り込みハンドラーを登録したうえで、ハンドラー内で kc_int_info を実行してください。

RESULT kc_int_map(word id, word32 mask)

引数
wordid:対応付けしたいハードウェア割り込みの ID
word32mask:対応付けしたい割り込み
戻り値
RC_SUCCESS:成功
RC_RIGHTLESS:許可されていない対象を操作した
RC_RESERVED:他のタスクが取得している
RC_RESOURCE_POOR:メモリー不足で実行できない
説明

ハードウェア割り込みをタスク割り込みに対応付けます。
ハードウェア割り込み発生時に指定したタスク割り込みが発生するようになります。
mask に 0 を指定すると対応付けを解除します。

ハードウェア割り込みはプラットフォーム固有に定義されます。
具体的に指定できる ID と、その内容に付いてはプラットフォームの説明を参照してください。

要求したハードウェア割り込みが他のタスクに取得されている場合は RC_RESERVED でエラー終了します。
対応付けが許可されていない割り込みを対応付けしようとしたり、自分で対応付けしていない割り込みを解放しようとした場合は RC_RIGHTLESS でエラー終了します。

X68000 の場合、は割り込みベクターの 31 と 64-107 が対応しています。
割り込み ID はベクター番号をそのまま指定してください。

RESULT kc_int_info(INTINFO* tips)

引数
INTINFO*tips:情報を受け取るアドレス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正なアドレスを指定した
説明

割り込みの情報を取得します。
内容は以下の通りです。

typedef struct {
    word execute_intr ;
} INTINFO ;
	
wordexecute_intr:現在ハンドラーを実行中の割り込み

複数の割り込みハンドラーを実行中の場合は、現在アクティブ(最も優先度が高い)割り込みが設定されます。

ミューテックス

kc_mtx で始まるカーネル・コールはミューテックスを提供します。
これは複数のタスクで同じ資源を利用する際に発生する、コンフリクトを避けるための排他機構です。
ミューテックスは再入可能です。
また、実行優先度を継承します。

HMTX kc_mtx_create(void)

引数
有りません
戻り値
0 以外:作成したミューテックスのハンドル
0:失敗
説明

ミューテックスを作成します。

RESULT kc_mtx_delete(HMTX hmtx)

引数
HMTXhmtx:削除するミューテックス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なミューテックスを指定した
RC_MTX_BROKEN:ミューテックスが壊れている
RC_RESERVED:他のタスクがロックしている
説明

ミューテックスを削除します。

削除したミューテックスを kc_mtx_lock で待っていたタスクには RC_FAIL が戻ります。
削除したミューテックスが壊れていた場合は RC_MTX_BROKEN を戻します。
他のタスクがロックしている場合は RC_RESERVED でエラー終了します。

RESULT kc_mtx_lock(HMTX hmtx, word nowait)

引数
HMTXhmtx:ロックするミューテックス
wordnowait:ロックできなかった時の動作を指定するフラグ
戻り値
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 しか実行できません。

RESULT kc_mtx_unlock(HMTX hmtx)

引数
HMTXhmtx:解放するミューテックス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なミューテックスを指定した
RC_RIGHTLESS:許可されていない対象を操作した
説明

ロックしているミューテックスを解放します。

自分がロックしていないミューテックスを解放しようとすると RC_RIGHTLESS でエラー終了します。
また多重ロックしている場合は同じ数だけ呼び出さなければ解放しません。

条件変数

kc_cnd で始まるカーネル・コールは条件変数を提供します。
これはミューテックスと協調して資源が利用可能になるのを待つ同期機構です。

HCND kc_cnd_create(void)

引数
有りません
戻り値
0 以外:作成した条件変数のハンドル
0:失敗
説明

条件変数を作成します。

RESULT kc_cnd_delete(HCND hcnd)

引数
HCNDhcnd:削除する条件変数
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正な条件変数を指定した
説明

条件変数を削除します。

kc_cnd_wait で削除した条件変数を待っていたタスクには RC_FAIL が戻ります。

RESULT kc_cnd_raise(HCND hcnd, word raisecnt)

引数
HCNDhcnd:通知する条件変数
wordraisecnt:起床させるタスクの数
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正な条件変数を指定した
説明

条件変数を待っているタスクを起床します。

引数の raisecnt は起床するタスクの数を制限するための設定で、 この数よりも多くのタスクが条件変数を待っている場合、 タスクの実行優先度の高いものから順番に raisecnt 個のタスクのみが起床し、残りは待機状態を維持します。
また raisecnt に 0 を指定した場合は全てのタスクが起床します。

条件変数を待っているタスクが無い場合は何の効果も有りません。

RESULT kc_cnd_wait(HCND hcnd, HMTX hmtx)

引数
HCNDhcnd:待機する条件変数
HMTXhmtx:待機する時に解放するミューテックス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正な条件変数を指定した
説明

条件変数を待ちます。
呼び出しタスクは待機している条件が発生するまで待機状態になり、 他の処理を実行する事はできません。

引数の hmtx は待機に入ると同時に解放するミューテックスを指定します。
hmtx に 0 を指定した場合は特にミューテックスを操作しません。

リモートプロシジャーコール

kc_rpc で始まるカーネル・コールはタスク間通信機能を提供します。
これはタスク-タスク間の同期通信で 1 塊のバイナリーデータを送受信できます。

通信に利用するメモリーは kc_ram_alloc で確保したメモリーブロック全体です。
また kc_ram_share で共有しているメモリーブロックは利用できません。

RESULT kc_rpc_request(HTSK htsk, void* msg, word size)

引数
HTSKhtsk:要求先のタスクハンドル
void*msg:リクエストデータの格納されたメモリーブロックを指すポインタ
wordsize:リクエストデータのサイズ (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 で指定したメモリーブロック全体がメッセージデータとして扱われます。

処理中のメモリーブロックを不正規な手順で参照・操作すると問題が発生します。

HRPC kc_rpc_accept(void** msg, word* size)

引数
void**msg:リクエストデータのアドレスを受け取るポインタ
word*size:リクエストデータのサイズを受け取るポインタ
戻り値
0 以外:取得したリクエストのハンドル
0:失敗
説明

呼び出しタスクに対して要求されたリクエストを取得します。
呼び出しタスクはリクエストを受け取るまで待機状態になり、 他の処理を実行する事はできません。
リクエストの内容に付いては kc_rpc_request を参照してください。

リクエストが複数溜まっている場合は、基本的に要求された順に取り出しますが、 要求したタスクの実行優先度の高いものが優先的に取り出されます。

取得したリクエストは kc_rpc_accept を呼び出したタスクでしか扱えません。
また取得したリクエストの実行優先度が取得したタスクの実行優先度よりも高い場合、 取得したタスクにリクエストの実行優先度が継承され、実行優先度が引き上げられます。
これは後述するカーネル・コールを呼び出してリクエストを手放すまで継続します。

処理が終わったら kc_rpc_reply を呼び出して応答を返すか、kc_rpc_transfer を呼び出してリクエストを他のタスクに転送/譲渡してください。

RESULT kc_rpc_reply(HRPC hrpc, RESULT rc)

引数
HRPChrpc:応答を返すリクエスト
RESULTrc: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 で終了します。

RESULT kc_rpc_transfer(HRPC hrpc, HTSK htsk, word direct)

引数
HRPChrpc:応答を返すリクエスト
HTSKhtsk:転送/譲渡先のタスクハンドル
worddirect:転送/譲渡の指定
戻り値
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 でエラー終了します。

HRPC kc_rpc_service(void** msg, void* size, HRPC hrpc, HTSK htsk, word direct, RESULT rc)

引数
void**msg:リクエストデータのアドレスを受け取るポインタ
word*size:リクエストデータのサイズを受け取るポインタ
HRPChrpc:0.待機前にリクエストへの応答をしない !0.応答を返すリクエスト
HTSKhtsk:0.応答処理 !0.転送/譲渡先のタスクハンドル
worddirect:転送/譲渡の指定
RESULTrc:kc_rpc_request に渡す戻り値
戻り値
0 以外:取得したリクエストのハンドル
0:失敗
説明

処理中のリクエストに対する応答(もしくは転送)処理と次のリクエストの取得を一括で処理します。
どの応答をするか(しないか)の選択は引数の内容で判断します。

RESULT kc_rpc_info(HRPC hrpc, RPCINFO* tips)

引数
HRPChrpc:情報を取得したいリクエスト
RPCINFO*tips:情報を受け取るアドレス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_HANDLE:不正なリクエストを指定した
RC_INVALIDATE_ARG:不正なアドレスを指定した
RC_RIGHTLESS:許可されていない対象を操作した
RC_RPC_BROKEN:リクエストが壊れている
説明

リクエストに付いての情報を取得します。
内容は以下の通りです。

typedef struct {
    HTSK htsk_from ;
    HJOB hjob_from ;
} RPCINFO ;
	
HTSKhtsk_from:リクエストを要求したタスクのハンドル
HJOBhjob_from:リクエストを要求したタスクのジョブハンドル

自分が kc_rpc_accept したか、 kc_rpc_transfer によって受け取ったリクエスト以外を指定とすると RC_RIGHTLESS でエラー終了します。
リクエストの要求元タスクが既に削除されていた場合は RC_RPC_BROKEN で終了します。

タイマー管理

kc_clc で始まるカーネル・コールはタイマーを提供します。
タイマーが扱う時間の単位は「チック」で、1 チックが実際にどれ位の時間かはシステムによって異なります。
具体的な設定値は kc_clc_info で取得してください。

RESULT kc_clc_alarm(word timeout, word repeat, word32 intbit)

引数
wordtimeout:タイムアウトまでのチック数
wordrepeat:周期タイムアウトの1周期分のチック数
word32intbit:通知に使用する割り込みのビット
戻り値
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_trapkc_int_wait で受け取ってください。

使用できるタイマーはタスク毎に 1 つです。
1 つのタスクで複数のタイマーを使う事はできません。

RESULT kc_clc_info(CLCINFO* tips)

引数
CLCINFO*tips:情報を受け取るアドレス
戻り値
RC_SUCCESS:成功
RC_INVALIDATE_ARG:不正なアドレスを指定した
説明

タイマーの情報を取得します。
内容は以下の通りです。

typedef struct {
    word system_tick ;
    word us_per_tick ;
    word tick_per_slice ;
} CLCINFO ;
	
wordsystem_tick:システム起動時から経過したチック数
wordus_per_tick:1 チックの時間 (us単位)
wordtick_per_slice:1 スライスの時間 (チック単位)

チックは OS が管理する時間の最小単位です。
1 チック毎にタイマー割り込みを処理し、スケジューリングやタイマーイベントを処理します。
スライスはタスクが連続で実行できる最大の時間で、この時間を越えて実行を続けようとした場合、OS により実行権を奪われます。

X68000 の場合、us_per_tick=4, tick_per_slice=5 です。

その他

RESULT kc_tas_try(tas_flg* flg)

引数
tas_flgflg:テスト・アンド・セットの使用するフラグ領域を指すポインタ
戻り値
RC_SUCCESS:確保成功
RC_FAIL:確保失敗
説明

いわゆる「テスト・アンド・セット」機能を実現します。

flg は 0 で初期化してから用いてください。
また、確保したフラグを解放する場合にも 0 を設定してください。

この機能は CPU 固有の対応命令をラップするもので、基本的には(カーネル・コールではない)単純な関数として実装されます。
CPU が対応する命令を持たない場合は別の方法で実装されたり、有効に機能しない場合があります。

索引

メモリー
kc_ram_alloc
kc_ram_free
kc_ram_share
kc_ram_info

ジョブ
kc_job_create
kc_job_delete
kc_job_start
kc_job_stop
kc_job_wait
kc_job_info
タスク
kc_tsk_create
kc_tsk_delete
kc_tsk_yield
kc_tsk_info

例外
kc_exc_root
kc_exc_trap

割り込み
kc_int_raise
kc_int_trap
kc_int_mask
kc_int_wait
kc_int_map
kc_int_info
ミューテックス
kc_mtx_create
kc_mtx_delete
kc_mtx_lock
kc_mtx_unlock

条件変数
kc_cnd_create
kc_cnd_delete
kc_cnd_raise
kc_cnd_wait

RPC
kc_rpc_request
kc_rpc_accept
kc_rpc_reply
kc_rpc_transfer
kc_rpc_service
kc_rpc_info
タイマー
kc_clc_alarm
kc_clc_info

その他
kc_tas_try
inserted by FC2 system