#include <queue.h>
#include "time_event.h"
データ構造 | |
union | waiting_information |
struct | task_initialization_block |
struct | task_control_block |
マクロ定義 | |
#define | LOG_TSKSTAT(p_tcb) |
#define | INT_PRIORITY(x) ((uint_t)((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_DLY (0x00U << 3) |
#define | TS_WAIT_SLP (0x01U << 3) |
#define | TS_WAIT_RDTQ (0x02U << 3) |
#define | TS_WAIT_RPDQ (0x03U << 3) |
#define | TS_WAIT_SEM (0x04U << 3) |
#define | TS_WAIT_FLG (0x05U << 3) |
#define | TS_WAIT_SDTQ (0x06U << 3) |
#define | TS_WAIT_SPDQ (0x07U << 3) |
#define | TS_WAIT_MBX (0x08U << 3) |
#define | TS_WAIT_MPF (0x09U << 3) |
#define | TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT) |
#define | TSTAT_RUNNABLE(tstat) (((tstat) & TS_RUNNABLE) != 0U) |
#define | TSTAT_WAITING(tstat) (((tstat) & TS_WAITING) != 0U) |
#define | TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0U) |
#define | TS_WAIT_MASK (0x0fU << 3) |
#define | TSTAT_WAIT_SLP(tstat) (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP) |
#define | TSTAT_WAIT_WOBJ(tstat) (((tstat) & TS_WAIT_MASK) >= TS_WAIT_RDTQ) |
#define | TSTAT_WAIT_WOBJCB(tstat) (((tstat) & TS_WAIT_MASK) >= TS_WAIT_SEM) |
#define | TBIT_TCB_PRIORITY 8 |
#define | tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1)) |
#define | INDEX_TSK(tskid) ((uint_t)((tskid) - TMIN_TSKID)) |
#define | get_tcb(tskid) (&(tcb_table[INDEX_TSK(tskid)])) |
#define | get_tcb_self(tskid) ((tskid) == TSK_SELF ? p_runtsk : get_tcb(tskid)) |
#define | TSKID(p_tcb) ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID)) |
型定義 | |
typedef union waiting_information | WINFO |
typedef struct task_initialization_block | TINIB |
typedef struct task_control_block | TCB |
関数 | |
void | initialize_task (void) |
TCB * | search_schedtsk (void) |
bool_t | make_runnable (TCB *p_tcb) |
bool_t | make_non_runnable (TCB *p_tcb) |
void | make_dormant (TCB *p_tcb) |
bool_t | make_active (TCB *p_tcb) |
bool_t | change_priority (TCB *p_tcb, uint_t newpri) |
bool_t | rotate_ready_queue (uint_t pri) |
void | call_texrtn (void) |
void | calltex (void) |
変数 | |
TCB * | p_runtsk |
TCB * | p_schedtsk |
bool_t | reqflg |
bool_t | disdsp |
bool_t | dspflg |
QUEUE | ready_queue [TNUM_TPRI] |
uint16_t | ready_primap |
const ID | tmax_tskid |
const TINIB | tinib_table [] |
const ID | torder_table [] |
TCB | tcb_table [] |
#define get_tcb | ( | tskid | ) | (&(tcb_table[INDEX_TSK(tskid)])) |
参照元 iact_tsk(), iras_tex(), irel_wai(), iwup_tsk(), rel_wai(), rsm_tsk(), と ter_tsk().
#define get_tcb_self | ( | tskid | ) | ((tskid) == TSK_SELF ? p_runtsk : get_tcb(tskid)) |
#define INDEX_TSK | ( | tskid | ) | ((uint_t)((tskid) - TMIN_TSKID)) |
#define INT_PRIORITY | ( | x | ) | ((uint_t)((x) - TMIN_TPRI)) |
#define tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1)) |
#define TS_DORMANT 0x00U |
#define TS_RUNNABLE 0x01U |
#define TS_SUSPENDED 0x04U |
#define TS_WAIT_FLG (0x05U << 3) |
#define TS_WAIT_MBX (0x08U << 3) |
#define TS_WAIT_MPF (0x09U << 3) |
#define TS_WAIT_RDTQ (0x02U << 3) |
#define TS_WAIT_RPDQ (0x03U << 3) |
#define TS_WAIT_SDTQ (0x06U << 3) |
#define TS_WAIT_SEM (0x04U << 3) |
#define TS_WAIT_SLP (0x01U << 3) |
#define TS_WAIT_SPDQ (0x07U << 3) |
#define TS_WAITING 0x02U |
#define TSTAT_DORMANT | ( | tstat | ) | ((tstat) == TS_DORMANT) |
参照元 act_tsk(), can_wup(), chg_pri(), get_pri(), iact_tsk(), iras_tex(), iwup_tsk(), ras_tex(), ref_tex(), ref_tsk(), sus_tsk(), ter_tsk(), と wup_tsk().
#define TSTAT_RUNNABLE | ( | tstat | ) | (((tstat) & TS_RUNNABLE) != 0U) |
#define TSTAT_SUSPENDED | ( | tstat | ) | (((tstat) & TS_SUSPENDED) != 0U) |
#define TSTAT_WAIT_SLP | ( | tstat | ) | (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP) |
#define TSTAT_WAIT_WOBJ | ( | tstat | ) | (((tstat) & TS_WAIT_MASK) >= TS_WAIT_RDTQ) |
#define TSTAT_WAIT_WOBJCB | ( | tstat | ) | (((tstat) & TS_WAIT_MASK) >= TS_WAIT_SEM) |
#define TSTAT_WAITING | ( | tstat | ) | (((tstat) & TS_WAITING) != 0U) |
参照元 irel_wai(), make_non_wait(), ref_tsk(), rel_wai(), rsm_tsk(), と ter_tsk().
typedef struct task_control_block TCB |
typedef struct task_initialization_block TINIB |
typedef union waiting_information WINFO |
void call_texrtn | ( | void | ) |
参照先 disdsp, dispatch, dspflg, task_control_block::enatex, task_initialization_block::exinf, LOG_TEX_ENTER, LOG_TEX_LEAVE, task_control_block::p_tinib, t_get_ipm, t_lock_cpu, t_sense_lock, t_set_ipm, t_unlock_cpu, task_control_block::texptn, と task_initialization_block::texrtn.
00428 { 00429 TEXPTN texptn; 00430 PRI saved_ipm; 00431 bool_t saved_disdsp, saved_dspflg; 00432 00433 saved_ipm = t_get_ipm(); 00434 saved_disdsp = disdsp; 00435 saved_dspflg = dspflg; 00436 do { 00437 texptn = p_runtsk->texptn; 00438 p_runtsk->enatex = false; 00439 p_runtsk->texptn = 0U; 00440 00441 t_unlock_cpu(); 00442 LOG_TEX_ENTER(texptn); 00443 (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn, 00444 p_runtsk->p_tinib->exinf); 00445 LOG_TEX_LEAVE(texptn); 00446 if (!t_sense_lock()) { 00447 t_lock_cpu(); 00448 } 00449 t_set_ipm(saved_ipm); 00450 disdsp = saved_disdsp; 00451 dspflg = saved_dspflg; 00452 if (p_runtsk != p_schedtsk && dspflg) { 00453 dispatch(); 00454 } 00455 } while (p_runtsk->texptn != 0U); 00456 p_runtsk->enatex = true; 00457 }
void calltex | ( | void | ) |
参照先 call_texrtn, task_control_block::enatex, と task_control_block::texptn.
00468 { 00469 if (p_runtsk->enatex && p_runtsk->texptn != 0U) { 00470 call_texrtn(); 00471 } 00472 }
参照先 dspflg, task_control_block::p_winfo, primap_clear(), primap_set(), task_control_block::priority, queue_delete(), queue_empty(), queue_insert_prev(), search_schedtsk, task_control_block::task_queue, task_control_block::tstat, TSTAT_RUNNABLE, TSTAT_WAIT_WOBJCB, と wobj_change_priority().
00345 { 00346 uint_t oldpri; 00347 00348 oldpri = p_tcb->priority; 00349 p_tcb->priority = newpri; 00350 00351 if (TSTAT_RUNNABLE(p_tcb->tstat)) { 00352 /* 00353 * タスクが実行できる状態の場合 00354 */ 00355 queue_delete(&(p_tcb->task_queue)); 00356 if (queue_empty(&(ready_queue[oldpri]))) { 00357 primap_clear(oldpri); 00358 } 00359 queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue)); 00360 primap_set(newpri); 00361 00362 if (p_schedtsk == p_tcb) { 00363 if (newpri >= oldpri) { 00364 p_schedtsk = search_schedtsk(); 00365 return(p_schedtsk != p_tcb && dspflg); 00366 } 00367 } 00368 else { 00369 if (newpri < p_schedtsk->priority) { 00370 p_schedtsk = p_tcb; 00371 return(dspflg); 00372 } 00373 } 00374 } 00375 else { 00376 if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) { 00377 /* 00378 * タスクが,同期・通信オブジェクトの管理ブロックの共通部 00379 * 分(WOBJCB)の待ちキューにつながれている場合 00380 */ 00381 wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb, 00382 p_tcb); 00383 } 00384 } 00385 return(false); 00386 }
void initialize_task | ( | void | ) |
参照先 task_control_block::actque, disdsp, dspflg, INDEX_TSK, make_active, make_dormant, NULL, task_control_block::p_tinib, queue_initialize(), ready_primap, reqflg, TA_ACT, tcb_table, tinib_table, TNUM_TPRI, tnum_tsk, torder_table, と task_initialization_block::tskatr.
00107 { 00108 uint_t i, j; 00109 TCB *p_tcb; 00110 00111 p_runtsk = p_schedtsk = NULL; 00112 reqflg = false; 00113 disdsp = false; 00114 dspflg = true; 00115 00116 for (i = 0; i < TNUM_TPRI; i++) { 00117 queue_initialize(&(ready_queue[i])); 00118 } 00119 ready_primap = 0U; 00120 00121 for (i = 0; i < tnum_tsk; i++) { 00122 j = INDEX_TSK(torder_table[i]); 00123 p_tcb = &(tcb_table[j]); 00124 p_tcb->p_tinib = &(tinib_table[j]); 00125 p_tcb->actque = false; 00126 make_dormant(p_tcb); 00127 if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) { 00128 make_active(p_tcb); 00129 } 00130 } 00131 }
参照先 activate_context, と make_runnable.
00322 { 00323 activate_context(p_tcb); 00324 return(make_runnable(p_tcb)); 00325 }
void make_dormant | ( | TCB * | p_tcb | ) |
参照先 task_control_block::enatex, task_initialization_block::ipriority, LOG_TSKSTAT, task_control_block::p_tinib, task_control_block::priority, task_control_block::texptn, TS_DORMANT, task_control_block::tstat, と task_control_block::wupque.
00304 { 00305 p_tcb->tstat = TS_DORMANT; 00306 p_tcb->priority = p_tcb->p_tinib->ipriority; 00307 p_tcb->wupque = false; 00308 p_tcb->enatex = false; 00309 p_tcb->texptn = 0U; 00310 LOG_TSKSTAT(p_tcb); 00311 }
参照先 dspflg, NULL, queue::p_next, primap_clear(), primap_empty(), task_control_block::priority, queue_delete(), queue_empty(), search_schedtsk, と task_control_block::task_queue.
00274 { 00275 uint_t pri = p_tcb->priority; 00276 QUEUE *p_queue = &(ready_queue[pri]); 00277 00278 queue_delete(&(p_tcb->task_queue)); 00279 if (queue_empty(p_queue)) { 00280 primap_clear(pri); 00281 if (p_schedtsk == p_tcb) { 00282 p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk(); 00283 return(dspflg); 00284 } 00285 } 00286 else { 00287 if (p_schedtsk == p_tcb) { 00288 p_schedtsk = (TCB *)(p_queue->p_next); 00289 return(dspflg); 00290 } 00291 } 00292 return(false); 00293 }
参照先 dspflg, LOG_TSKSTAT, NULL, primap_set(), task_control_block::priority, queue_insert_prev(), task_control_block::task_queue, TS_RUNNABLE, と task_control_block::tstat.
00245 { 00246 uint_t pri = p_tcb->priority; 00247 00248 p_tcb->tstat = TS_RUNNABLE; 00249 LOG_TSKSTAT(p_tcb); 00250 queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue)); 00251 primap_set(pri); 00252 00253 if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) { 00254 p_schedtsk = p_tcb; 00255 return(dspflg); 00256 } 00257 return(false); 00258 }
参照先 dspflg, queue::p_next, queue_delete_next(), queue_empty(), と queue_insert_prev().
00400 { 00401 QUEUE *p_queue = &(ready_queue[pri]); 00402 QUEUE *p_entry; 00403 00404 if (!queue_empty(p_queue) && p_queue->p_next->p_next != p_queue) { 00405 p_entry = queue_delete_next(p_queue); 00406 queue_insert_prev(p_queue, p_entry); 00407 if (p_schedtsk == (TCB *) p_entry) { 00408 p_schedtsk = (TCB *)(p_queue->p_next); 00409 return(dspflg); 00410 } 00411 } 00412 return(false); 00413 }
TCB* search_schedtsk | ( | void | ) |
参照先 primap_search().
00225 { 00226 uint_t schedpri; 00227 00228 schedpri = primap_search(); 00229 return((TCB *)(ready_queue[schedpri].p_next)); 00230 }
uint16_t ready_primap |
QUEUE ready_queue[TNUM_TPRI] |
const TINIB tinib_table[] |
const ID tmax_tskid |
const ID torder_table[] |
Copyright © 2008 by Kijineko Inc.