高級言語対応ルーチン

タスクやハンドラを高級言語で記述した場合にもカーネルに関する処理と言語環境に関する処理を分離できるように、高級言語対応ルーチンの機能を用意している。高級言語対応ルーチンの利用の有無は、オブジェクト属性やハンドラ属性の一つ(TA_HLNG)として指定される。

TA_HLNG の指定が無い場合は、tk_cre_tsktk_def_int などのパラメータで指定されたスタートアドレスから直接タスクやハンドラを起動するが、TA_HLNG の指定がある場合は、最初に高級言語のスタートアップ処理ルーチン(高級言語対応ルーチン)を起動し、その中から tk_cre_tsktk_def_int のパラメータで指定されたタスク起動アドレスやハンドラアドレスに間接ジャンプする。この場合、カーネルから見ると、タスク起動アドレスやハンドラアドレスは高級言語対応ルーチンに対するパラメータとなる。こういった方法をとることにより、カーネルに関する処理と言語環境に関する処理が分離され、異なる言語環境にも容易に対応できる。

また、高級言語対応ルーチンを利用すれば、ハンドラをC言語の関数として書いた場合に、単なる関数のリターン(returnや"}")を行うだけで、ハンドラから戻るシステムコールを自動的に実行することが可能となる。

しかし、CPUの実行モードがあるシステムにおいては、カーネルと同じ保護レベルで動作する割込みハンドラなどでは比較的容易に高級言語対応ルーチンを実現できるのに対し、カーネルと異なる保護レベルで動作するタスクやタスク例外ハンドラなどは高級言語対応ルーチンを実現することが難しい。そのため、タスクの場合は高級言語対応ルーチンを使用したとしても関数からのリターンによるタスクの終了は保証しない。タスクの関数からreturnや"}"を用いてリターンした場合の動作は未定義とする。タスクの最後には、必ず自タスク終了(tk_ext_tsk)または自タスクの終了と削除(tk_exd_tsk)を発行する必要がある。

また、タスク例外ハンドラの高級言語対応ルーチンはソースコードで提供することとし、ユーザプログラムに組み込むものとしている。

高級言語対応ルーチンの内部動作は図1のようになる。

図 1. 高級言語対応ルーチンの動作