task.h

タスク管理モジュール [詳細]

#include "queue.h"
#include "class.h"
#include "time_event.h"

task.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

データ構造

union  waiting_information
 待ち情報ブロック(WINFO)の定義 [詳細]
struct  task_initialization_block
 タスク初期化ブロック [詳細]
struct  task_control_block
 タスク管理ブロック(TCB) [詳細]

マクロ定義

#define INT_PRIORITY(x)   ((UINT)((x) - TMIN_TPRI))
#define EXT_TSKPRI(x)   ((PRI)(x) + TMIN_TPRI)
#define TS_DORMANT   0x00u
#define TS_RUNNABLE   0x01u
#define TS_WAITING   0x02u
#define TS_SUSPENDED   0x04u
#define TS_WAIT_SLEEP   0x08u
#define TS_WAIT_WOBJ   0x10u
#define TS_WAIT_WOBJCB   0x20u
#define TSTAT_DORMANT(tstat)   ((tstat) == TS_DORMANT)
#define TSTAT_RUNNABLE(tstat)   (((tstat) & TS_RUNNABLE) != 0)
#define TSTAT_WAITING(tstat)   (((tstat) & TS_WAITING) != 0)
#define TSTAT_SUSPENDED(tstat)   (((tstat) & TS_SUSPENDED) != 0)
#define TBIT_TCB_TSTAT   6
#define TBIT_TCB_PRIORITY   4
#define MY_TNUM_TSK   ((UINT)(tmax_tskid - TMIN_ID + 1))
 タスクの数
#define INDEX_TSK(tskid)   ((UINT)((tskid) - TMIN_ID))
#define get_tcb(ccb, tskid)   (&(((TCB *)(ccb->tsk.cb_table))[INDEX_TSK(tskid)]))
#define get_tcb_self(ccb, tskid)   ((tskid) == TSK_SELF ? runtsk : get_tcb(ccb, tskid))
#define TSKID(tcb)   ((ID)(((tcb) - tcb_table) + TMIN_ID))
 TCBからタスクIDを取り出すためのマクロ
#define MTSKID(cb_table, tcb)   ((ID)(((tcb) - (TCB*)cb_table) + TMIN_ID))
 TCBからタスクIDを取り出すためのマクロ(マルチプロセッサ用)

型定義

typedef task_control_block TCB
 前方参照
typedef task_initialization_block TINIB
typedef waiting_information WINFO
 待ち情報ブロック(WINFO)の定義

関数

void task_initialize ()
 タスク管理モジュールの初期化
void task_init_activate ()
 カーネル起動時のTA_ACT指定のタスクに対する起動処理
TCBsearch_schedtsk (CCB *ccb)
 最高優先順位タスクのサーチ
BOOL make_runnable (CCB *ccb, TCB *tcb)
 実行できる状態への移行
BOOL make_non_runnable (CCB *ccb, TCB *tcb)
 実行できる状態から他の状態への移行
void make_dormant (TCB *tcb)
 休止状態への移行
BOOL make_active (CCB *ccb, TCB *tcb)
 休止状態から実行できる状態への移行
BOOL dispatch_request (INT proc_id)
 ディスパッチャの起動要求(MP)
BOOL change_priority (CCB *ccb, TCB *tcb, UINT newpri)
 レディキュー中のタスクの優先度の変更
BOOL rotate_ready_queue (CCB *ccb, UINT pri)
 レディキューの回転
void call_texrtn (void)
 タスク例外処理ルーチンの呼出し
void dispatch_call_texrtn (void)
 ディスパッチャの出口でのタスク例外処理ルーチンの呼び出し
void calltex (void)
 タスク例外処理ルーチンの起動

変数

TCBruntsk
 実行状態のタスク
TCBschedtsk
 最高優先順位のタスク
BOOL reqflg
 ディスパッチ/タスク例外処理ルーチン起動要求フラグ
BOOL enadsp
 ディスパッチ許可状態
QUEUE ready_queue [TNUM_TPRI]
 レディキュー
UINT ready_primap
 レディキューサーチのためのビットマップ
const ID tmax_tskid
 タスクIDの最大値(kernel_cfg.c)
const TINIB tinib_table []
 タスク初期化ブロックのエリア(kernel_cfg.c)
const ID torder_table []
 タスク生成順序テーブル(kernel_cfg.c)
TCB tcb_table []
 TCBのエリア(kernel_cfg.c)


説明

タスク管理モジュール

task.h で定義されています。


マクロ定義

#define EXT_TSKPRI  )     ((PRI)(x) + TMIN_TPRI)
 

task.h62 行で定義されています。

#define get_tcb ccb,
tskid   )     (&(((TCB *)(ccb->tsk.cb_table))[INDEX_TSK(tskid)]))
 

task.h298 行で定義されています。

#define get_tcb_self ccb,
tskid   )     ((tskid) == TSK_SELF ? runtsk : get_tcb(ccb, tskid))
 

task.h300 行で定義されています。

#define INDEX_TSK tskid   )     ((UINT)((tskid) - TMIN_ID))
 

task.h297 行で定義されています。

#define INT_PRIORITY  )     ((UINT)((x) - TMIN_TPRI))
 

task.h61 行で定義されています。

#define MTSKID cb_table,
tcb   )     ((ID)(((tcb) - (TCB*)cb_table) + TMIN_ID))
 

TCBからタスクIDを取り出すためのマクロ(マルチプロセッサ用)

task.h311 行で定義されています。

#define MY_TNUM_TSK   ((UINT)(tmax_tskid - TMIN_ID + 1))
 

タスクの数

task.h292 行で定義されています。

#define TBIT_TCB_PRIORITY   4
 

task.h177 行で定義されています。

#define TBIT_TCB_TSTAT   6
 

task.h173 行で定義されています。

#define TS_DORMANT   0x00u
 

task.h72 行で定義されています。

#define TS_RUNNABLE   0x01u
 

task.h73 行で定義されています。

#define TS_SUSPENDED   0x04u
 

task.h75 行で定義されています。

参照元 make_non_wait().

#define TS_WAIT_SLEEP   0x08u
 

task.h77 行で定義されています。

#define TS_WAIT_WOBJ   0x10u
 

task.h78 行で定義されています。

#define TS_WAIT_WOBJCB   0x20u
 

task.h79 行で定義されています。

#define TS_WAITING   0x02u
 

task.h74 行で定義されています。

#define TSKID tcb   )     ((ID)(((tcb) - tcb_table) + TMIN_ID))
 

TCBからタスクIDを取り出すためのマクロ

task.h306 行で定義されています。

#define TSTAT_DORMANT tstat   )     ((tstat) == TS_DORMANT)
 

task.h89 行で定義されています。

#define TSTAT_RUNNABLE tstat   )     (((tstat) & TS_RUNNABLE) != 0)
 

task.h90 行で定義されています。

#define TSTAT_SUSPENDED tstat   )     (((tstat) & TS_SUSPENDED) != 0)
 

task.h92 行で定義されています。

参照元 make_non_wait().

#define TSTAT_WAITING tstat   )     (((tstat) & TS_WAITING) != 0)
 

task.h91 行で定義されています。

参照元 make_non_wait().


型定義

typedef struct task_control_block TCB
 

前方参照

task.h51 行で定義されています。

typedef struct task_initialization_block TINIB
 

task.h52 行で定義されています。

typedef union waiting_information WINFO
 

待ち情報ブロック(WINFO)の定義

タスクが待ち状態の間は,TCB およびそこから指される WINFO を次のよ うに設定しなければならない.

(a) TCB のタスク状態を待ち状態にする.その際に,待ち状態に伴う付属 状態(TS_WAIT_????)も設定する.

(b) タイムアウトを監視するために,タイムイベントブロックを登録する. 登録するタイムイベントブロックは,待ちに入るサービスコール処理関数 のローカル変数として確保し,それへのポインタを WINFO の tmevtb に 記憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には, tmevtb を NULL にする.

同期・通信オブジェクトに対する待ち状態の場合には,標準の WINFO に wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.h で定義)を使 い,タスク状態に TS_WAIT_WOBJ を設定する.また,以下の (c)〜(e) の 設定を行う必要がある.同期・通信オブジェクトに関係しない待ち(起床 待ち,時間経過待ち)の場合には,(c)〜(e) は必要ない.

(c) TCB を待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待 ちキューにつなぐために,task_queue を使う.TCB を同期・通信オブジェ クトの管理ブロックの共通部分(WOBJCB)の待ちキューにつないだ場合に は,タスク状態に TS_WAIT_WOBJCB を設定する.

(d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを, WINFO_WOBJ の wobjcb に記憶する. FDMPカーネルで wobjcb を使うのは,優先度順の待ちキューにつながれて いるタスクの優先度が変更された場合のみであるが,デバッグ情報を取り 出しやすいように,待ちキューが優先度順でない場合にも wobjcb を設定 する.

(e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な 情報がある場合には,WINFO_WOBJ に必要な情報のためのフィールドを追加 した構造体を定義し,WINFO_WOBJ の代わりに用いる.

待ち状態を解除する際には,待ち解除したタスクからの返値を WINFO の wercd に設定する.wercd を使うのは待ち解除以降であるのに対して, tmevtb は待ち解除後は使わないため,メモリ節約のために共用体(union) を使っている.


関数

void call_texrtn void   ) 
 

タスク例外処理ルーチンの呼出し

タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの 保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解 除する. タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間 に保留例外要因が 0 でなくなっていれば,再びタスク例外処理ルーチン を呼び出す.保留例外要因が 0 の場合には,例外処理許可状態にして関 数からリターンする. この関数は,実行状態のタスクが,タスク例外処理許可状態(enatex が TRUE)で,保留例外要因が 0 でない(texptn が 0 でない)場合に呼び 出すことを想定している.この関数は,CPUロック状態で呼び出さなけれ ばならない.

void calltex void   ) 
 

タスク例外処理ルーチンの起動

実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば, タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時 は,一時的にCPUロックを解除する. この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口 処理から呼び出されることを想定しているが,同等の処理をターゲット依 存部で記述してもよい.その場合には,OMIT_CALLTEX をマクロ定義すれ ばよい. p

BOOL change_priority CCB ccb,
TCB tcb,
UINT  newpri
 

レディキュー中のタスクの優先度の変更

tcb で指定されるレディキュー中のタスクの優先度を newpri(内部表現) に変更する.また,必要な場合には最高優先順位のタスクを更新し,ディ スパッチ許可状態であれば TRUE を返す.そうでない場合は FALSE を返 す.

void dispatch_call_texrtn void   ) 
 

ディスパッチャの出口でのタスク例外処理ルーチンの呼び出し

call_tertn() はタスクロックを取得状態での呼び出しを想定している. ディスパッチャのではタスクロックを取得していないため,タスクロックを 取得してcall_tertn()を呼び出すこの関数を呼び出す.

BOOL dispatch_request INT  proc_id  ) 
 

ディスパッチャの起動要求(MP)

システムコール発行の結果,ディスパッチャの起動が必要となった時に使う. 他プロセッサが対象のときは割り込みで通知しFALSEを返す. 自プロセッサの場合,TRUEを返す

BOOL make_active CCB ccb,
TCB tcb
 

休止状態から実行できる状態への移行

tcb で指定されるタスクの状態を休止状態から実行できる状態とする.実 行できる状態に移行したタスクへのディスパッチが必要な場合は TRUE, そうでない場合は FALSE を返す.

void make_dormant TCB tcb  ) 
 

休止状態への移行

tcb で指定されるタスクの状態を休止状態とする.また,タスクの起動時 に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設定 する.

BOOL make_non_runnable CCB ccb,
TCB tcb
 

実行できる状態から他の状態への移行

tcb で指定されるタスクをレディキューから削除する.tcb で指定したタ スクが最高優先順位のタスクであった場合には,最高優先順位のタスクを 設定しなおし,ディスパッチ許可状態であれば TRUE を返す.そうでない 場合は FALSE を返す.タスクの状態は更新しない.

BOOL make_runnable CCB ccb,
TCB tcb
 

実行できる状態への移行

tcb で指定されるタスクの状態を実行できる状態とし,レディキューに挿 入する.実行できる状態になったタスクの優先度が,最高優先順位のタス クの優先度よりも高い場合は,最高優先順位のタスクを更新し,ディスパッ チ許可状態であれば TRUE を返す.そうでない場合は FALSE を返す.

BOOL rotate_ready_queue CCB ccb,
UINT  pri
 

レディキューの回転

レディキュー中の,pri で指定される優先度のタスクキューを回転させる. また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保 留されていなければ TRUE を返す.そうでない場合は FALSE を返す.

TCB* search_schedtsk CCB ccb  ) 
 

最高優先順位タスクのサーチ

レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ を返す.レディキューが空の場合には,この関数を呼び出してはならない.

void task_init_activate  ) 
 

カーネル起動時のTA_ACT指定のタスクに対する起動処理

参照元 kernel_start().

void task_initialize  ) 
 

タスク管理モジュールの初期化


変数

BOOL enadsp
 

ディスパッチ許可状態

ディスパッチ許可状態である(すなわち,ディスパッチ禁止状態でない) ことを示すフラグ.

UINT ready_primap
 

レディキューサーチのためのビットマップ

レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー にタスクが入っているかどうかを示すビットマップを用意している.ビッ トマップを使うことで,メモリアクセスの回数を減らすことができるが, ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち る可能性もある.

QUEUE ready_queue[TNUM_TPRI]
 

レディキュー

レディキューは,実行できる状態のタスクを管理するためのキューで,優 先度ごとのタスクキューで構成されている.タスクのTCBは,該当する優 先度のキューに登録される.

BOOL reqflg
 

ディスパッチ/タスク例外処理ルーチン起動要求フラグ

割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは タスク例外処理ルーチンの起動を要求することを示すフラグ.

TCB* runtsk
 

実行状態のタスク

実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の TCB を指すポインタ.実行状態のタスクがない場合は NULL にする. サービスコールの処理中で,自タスク(サービスコールを呼び出したタス ク)に関する情報を参照する場合は runtsk を使う.runtsk を書き換え るのは,ディスパッチャ(と初期化処理)のみである.

TCB* schedtsk
 

最高優先順位のタスク

実行できるタスクの中で最高優先順位のタスクの TCB を指すポインタ.実 行できるタスクがない場合は NULL にする. ディスパッチ禁止状態など,ディスパッチが保留されている間は,runtsk と一致しているとは限らない.

TCB tcb_table[]
 

TCBのエリア(kernel_cfg.c)

const TINIB tinib_table[]
 

タスク初期化ブロックのエリア(kernel_cfg.c)

const ID tmax_tskid
 

タスクIDの最大値(kernel_cfg.c)

const ID torder_table[]
 

タスク生成順序テーブル(kernel_cfg.c)


Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:18 2006 に Doxygen によって生成されました。