オリジナルOS「MicrOS」の設計と実装(3) ―― MicrOSのシステム・コール
3.タスク関連の関数
ここからはMicrOSのシステム・コールについて解説します.まずはマルチタスクの要であるタスク関連から説明します.
● タスクの登録
_TCB *__task(int (*proc)(void), int stackSize, int priority)
proc 関数をタスクとして登録します.このほかにスタック・サイズとタスクの優先度(プライオリティ)を与えます.__task関数は,指定されたstackSize にTCBの固定領域と外部割り込み発生に使用されるスタック量を加えてTCBのサイズを決定し,このタスクのTCB領域をシステム・コントロール・ブロックの中に割り当てします.システム・コントロール・ブロック中のTCBのための領域は,カレント・タスクのセーブ・データを基点として__task要求があるたびに若いアドレスに向かって割り当てられていきます.priorityはシステム定数0~SYSNPRI(最大値は256)未満の値でなければなりません.タスク登録が正常に行われると,割り当てられたアサインしたTCBのアドレスを返します.
タスク登録できなかったときはNULLが返ります.このようなときは,システム・コントロール・ブロックのサイズを変更してシステムを再ビルドしない限り,正常な動作は望めません.
● 現在実行中のタスクのTCBアドレスの取得
_TCB *__getCurTcb(void)
現在実行中のタスクのTCBアドレスが返り値です.
● 現在実行中のタスクの優先度を変更する
int __chgPri(unsigned char pri)
現在実行中のタスクの優先度を変更します.返り値は変更前の優先度です.優先度はSYSNPRI未満の数値でなければなりません.優先度を変更しても,タスクが実行されている間は反映されません.割り込みなどが発生し,タスクの制御が取り上げられて初めて,有効になります.
● RQB初期設定
void __rqbinit(void *rqb)
オーナを必要とするRQB(Request Control Block)にオーナをセットします.この関数は,タスクの初期設定の部分でコールするようにしてください.なお,現状でMicrOSが定義するオーナを必要とするRQBは_TMRRQBです.
● SCBタイプの設定
int __setSCBtype(_SCB *scb, int typ)
MicrOSが定義するSCB(Service Control Block)の多くは,デフォルトでFIFOリンクを持つように設定されます.このSCBをほかのアトリビュートへ変更するために用います.このシステム・コールは,SCBを使った制御が開始される前にタスクの初期設定部分でコールするようにしてください.返り値は新たなタイプを設定する以前の値です.
● タスク・スイッチの禁止
int __DTS(void)
タスク・スイッチを禁止します.割り込みは受け付けることができます.タスク・スイッチ禁止の状態はカウンタによって管理されます.0はタスク・スイッチを許可した状態で,0以外のときにタスク・スイッチ禁止になります.__DTSはカウンタをインクリメントします.返り値はカウンタの値です.
● タスク・スイッチ禁止の解除
int __ETS(void)
タスク・スイッチ禁止を解除します.カウンタをデクリメントして0になったときにタスク・スイッチ禁止の状態が解かれ,タスク・スイッチ禁止間にアクティブになったタスクがあったかどうかがチェックされ,アクティブになったタスクがあればタスク・スイッチします.返り値はカウンタの値です.なお,カウンタの値は0以下にはなりません.また,ウェイト系のシステム・コールを発行したときも,タスク・スイッチ禁止のカウンタはクリアされます.
tag: OS