#include "jsp_kernel.h" #include "task.h" #include <cpu_context.h>
#include "jsp_kernel.h"
#include "task.h"
#include <cpu_context.h>
task.cのインクルード依存関係図
ソースコードを見る。
task.c で定義されています。
task.c の 361 行で定義されています。
task.c の 369 行で定義されています。
参照先 task_control_block::enatex・task_initialization_block::exinf・FALSE・LOG_TEX_ENTER・LOG_TEX_LEAVE・runtsk・t_lock_cpu()・t_sense_lock・t_unlock_cpu()・task_control_block::texptn・task_initialization_block::texrtn・task_control_block::tinib・TRUE.
参照元 ena_tex()・ras_tex().
00370 { 00371 TEXPTN texptn; 00372 00373 do { 00374 texptn = runtsk->texptn; 00375 runtsk->enatex = FALSE; 00376 runtsk->texptn = 0; 00377 t_unlock_cpu(); 00378 LOG_TEX_ENTER(texptn); 00379 ((TEXRTN)(*runtsk->tinib->texrtn))(texptn, 00380 runtsk->tinib->exinf); 00381 LOG_TEX_LEAVE(texptn); 00382 if (!t_sense_lock()) { 00383 t_lock_cpu(); 00384 } 00385 } while (runtsk->texptn != 0); 00386 runtsk->enatex = TRUE; 00387 }
関数の呼び出しグラフ:
task.c の 302 行で定義されています。
参照先 enadsp・FALSE・PRIMAP_BIT・task_control_block::priority・queue_delete()・queue_empty()・queue_insert_prev()・ready_primap・ready_queue・schedtsk・search_schedtsk()・task_control_block::task_queue.
参照元 chg_pri().
00303 { 00304 UINT oldpri = tcb->priority; 00305 00306 tcb->priority = newpri; 00307 queue_delete(&(tcb->task_queue)); 00308 if (queue_empty(&(ready_queue[oldpri]))) { 00309 ready_primap &= ~PRIMAP_BIT(oldpri); 00310 } 00311 queue_insert_prev(&(ready_queue[newpri]), &(tcb->task_queue)); 00312 ready_primap |= PRIMAP_BIT(newpri); 00313 00314 if (schedtsk == tcb) { 00315 if (newpri >= oldpri) { 00316 schedtsk = search_schedtsk(); 00317 return(schedtsk != tcb && enadsp); 00318 } 00319 } 00320 else { 00321 if (newpri < schedtsk->priority) { 00322 schedtsk = tcb; 00323 return(enadsp); 00324 } 00325 } 00326 return(FALSE); 00327 }
task.c の 278 行で定義されています。
参照先 task_control_block::actcnt・exit_and_dispatch()・FALSE・make_active()・make_dormant()・make_non_runnable()・runtsk.
参照元 ext_tsk().
00279 { 00280 make_non_runnable(runtsk); 00281 make_dormant(runtsk); 00282 if (runtsk->actcnt) { 00283 runtsk->actcnt = FALSE; 00284 make_active(runtsk); 00285 } 00286 exit_and_dispatch(); 00287 }
task.c の 264 行で定義されています。
参照先 activate_context()・make_runnable().
参照元 act_tsk()・exit_task()・iact_tsk()・task_initialize()・ter_tsk().
00265 { 00266 activate_context(tcb); 00267 return(make_runnable(tcb)); 00268 }
task.c の 245 行で定義されています。
参照先 create_context()・task_control_block::enatex・FALSE・task_initialization_block::ipriority・LOG_TSKSTAT・task_control_block::priority・task_control_block::texptn・task_control_block::tinib・TS_DORMANT・task_control_block::tstat・task_control_block::wupcnt.
参照元 exit_task()・task_initialize()・ter_tsk().
00246 { 00247 tcb->priority = tcb->tinib->ipriority; 00248 tcb->tstat = TS_DORMANT; 00249 tcb->wupcnt = FALSE; 00250 tcb->enatex = FALSE; 00251 tcb->texptn = 0; 00252 create_context(tcb); 00253 LOG_TSKSTAT(tcb); 00254 }
task.c の 214 行で定義されています。
参照先 enadsp・FALSE・queue::next・NULL・PRIMAP_BIT・task_control_block::priority・queue_delete()・queue_empty()・ready_primap・ready_queue・schedtsk・search_schedtsk()・task_control_block::task_queue.
参照元 dly_tsk()・exit_task()・make_wait()・make_wait_tmout()・sus_tsk()・ter_tsk().
00215 { 00216 UINT pri = tcb->priority; 00217 QUEUE *queue = &(ready_queue[pri]); 00218 00219 queue_delete(&(tcb->task_queue)); 00220 if (queue_empty(queue)) { 00221 ready_primap &= ~PRIMAP_BIT(pri); 00222 if (schedtsk == tcb) { 00223 schedtsk = (ready_primap == 0) ? (TCB * ) NULL 00224 : search_schedtsk(); 00225 return(enadsp); 00226 } 00227 } 00228 else { 00229 if (schedtsk == tcb) { 00230 schedtsk = (TCB *)(queue->next); 00231 return(enadsp); 00232 } 00233 } 00234 return(FALSE); 00235 }
task.c の 185 行で定義されています。
参照先 enadsp・FALSE・LOG_TSKSTAT・NULL・PRIMAP_BIT・task_control_block::priority・queue_insert_prev()・ready_primap・ready_queue・schedtsk・task_control_block::task_queue・TS_RUNNABLE・task_control_block::tstat.
参照元 make_active()・make_non_wait()・rsm_tsk().
00186 { 00187 UINT pri = tcb->priority; 00188 00189 tcb->tstat = TS_RUNNABLE; 00190 LOG_TSKSTAT(tcb); 00191 queue_insert_prev(&(ready_queue[pri]), &(tcb->task_queue)); 00192 ready_primap |= PRIMAP_BIT(pri); 00193 00194 if (schedtsk == (TCB *) NULL || pri < schedtsk->priority) { 00195 schedtsk = tcb; 00196 return(enadsp); 00197 } 00198 return(FALSE); 00199 }
task.c の 340 行で定義されています。
参照先 enadsp・FALSE・queue::next・queue_delete_next()・queue_empty()・queue_insert_prev()・ready_queue・schedtsk.
参照元 irot_rdq()・rot_rdq().
00341 { 00342 QUEUE *queue = &(ready_queue[pri]); 00343 QUEUE *entry; 00344 00345 if (!(queue_empty(queue)) && queue->next->next != queue) { 00346 entry = queue_delete_next(queue); 00347 queue_insert_prev(queue, entry); 00348 if (schedtsk == (TCB *) entry) { 00349 schedtsk = (TCB *)(queue->next); 00350 return(enadsp); 00351 } 00352 } 00353 return(FALSE); 00354 }
task.c の 166 行で定義されています。
参照先 bitmap_search()・ready_primap・ready_queue.
参照元 change_priority()・make_non_runnable().
00167 { 00168 UINT schedpri; 00169 00170 schedpri = bitmap_search(ready_primap); 00171 return((TCB *)(ready_queue[schedpri].next)); 00172 }
task.c の 88 行で定義されています。
参照先 task_control_block::actcnt・enadsp・FALSE・INDEX_TSK・make_active()・make_dormant()・NULL・queue_initialize()・ready_primap・ready_queue・reqflg・runtsk・schedtsk・TA_ACT・tcb_table・task_control_block::tinib・tinib_table・TNUM_TPRI・TNUM_TSK・torder_table・TRUE・task_initialization_block::tskatr.
00089 { 00090 UINT i, j; 00091 TCB *tcb; 00092 00093 runtsk = schedtsk = NULL; 00094 reqflg = FALSE; 00095 enadsp = TRUE; 00096 00097 for (i = 0; i < TNUM_TPRI; i++) { 00098 queue_initialize(&(ready_queue[i])); 00099 } 00100 ready_primap = 0; 00101 00102 for (i = 0; i < TNUM_TSK; i++) { 00103 j = INDEX_TSK(torder_table[i]); 00104 tcb = &(tcb_table[j]); 00105 tcb->tinib = &(tinib_table[j]); 00106 tcb->actcnt = FALSE; 00107 make_dormant(tcb); 00108 if ((tcb->tinib->tskatr & TA_ACT) != 0) { 00109 make_active(tcb); 00110 } 00111 } 00112 }
ディスパッチ許可状態
ディスパッチ許可状態である (すなわち,ディスパッチ禁止状態でない) ことを示すフラグ.
task.c の 69 行で定義されています。
参照元 change_priority()・dis_dsp()・ena_dsp()・ext_tsk()・make_non_runnable()・make_runnable()・rotate_ready_queue()・sns_dpn()・sns_dsp()・sus_tsk()・task_initialize()・vxsns_dpn()・vxsns_dsp().
レディキューサーチのためのビットマップ
レディキューのサーチを効率よく行うために,優先度ごとのタスクキューにタスクが入っているかどうかを示すビットマップを用意している.ビットマップを使うことで,メモリアクセスの回数を減らすことができるが, ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ちる可能性もある.
task.c の 82 行で定義されています。
参照元 change_priority()・make_non_runnable()・make_runnable()・search_schedtsk()・task_initialize().
レディキュー
レディキューは,実行できる状態のタスクを管理するためのキューである. 実行状態のタスクも管理しているため,レディ (実行可能) キューという名称は正確ではないが,レディキューという名称が定着しているため,この名称で呼ぶことにする.
レディキューは,優先度ごとのタスクキューで構成されている.タスクのTCBは,該当する優先度のキューに登録される.
task.c の 74 行で定義されています。
参照元 change_priority()・make_non_runnable()・make_runnable()・rotate_ready_queue()・search_schedtsk()・task_initialize().
ディスパッチ/タスク例外処理ルーチン起動要求フラグ
割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたはタスク例外処理ルーチンの起動を要求することを示すフラグ.
task.c の 64 行で定義されています。
参照元 iact_tsk()・ifsnd_dtq()・ipsnd_dtq()・iras_tex()・irel_wai()・irot_rdq()・iset_flg()・isig_sem()・iwup_tsk()・task_initialize()・wait_tmout()・wait_tmout_ok().
実行状態のタスク
実行状態のタスク (=プロセッサがコンテキストを持っているタスク) の TCB を指すポインタ.実行状態のタスクがない場合は NULL にする. サービスコールの処理中で,自タスク (サービスコールを呼び出したタスク) に関する情報を参照する場合は runtsk を使う.runtsk を書き換えるのは,ディスパッチャ (と初期化処理) のみである.
task.c の 54 行で定義されています。
参照元 call_texrtn()・dis_tex()・dly_tsk()・ena_dsp()・ena_tex()・exit_task()・get_tid()・iget_tid()・iras_tex()・make_wait()・make_wait_tmout()・ras_tex()・rcv_dtq()・rot_rdq()・slp_tsk()・sns_tex()・sus_tsk()・task_initialize()・trcv_dtq()・tslp_tsk()・vxsns_tex()・wobj_make_wait()・wobj_make_wait_tmout()・wobj_queue_insert().
最高優先順位のタスク
実行できるタスクの中で最高優先順位のタスクの TCB を指すポインタ.実行できるタスクがない場合は NULL にする. ディスパッチ禁止状態など,ディスパッチが保留されている間は,runtsk と一致しているとは限らない.
task.c の 59 行で定義されています。
参照元 change_priority()・ena_dsp()・make_non_runnable()・make_runnable()・rotate_ready_queue()・task_initialize().