SYSCALL ER sta_cyc(ID cycid) { CYCCB *cyccb; ER ercd; LOG_STA_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); cyccb = get_cyccb(cycid); t_lock_cpu(); if (cyccb->cycsta) { tmevtb_dequeue(&(cyccb->tmevtb)); } else { cyccb->cycsta = TRUE; } tmevtb_enqueue_cyc(cyccb, base_time + cyccb->cycinib->cyctim); ercd = E_OK; t_unlock_cpu(); exit: LOG_STA_CYC_LEAVE(ercd); return(ercd); }
void call_cychdr(CYCCB *p_cyccb) { PRI saved_ipm; /* * 次回の起動のためのタイムイベントブロックを登録する. * * 同じタイムティックで周期ハンドラを再度起動すべき場合には,この * 関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな * る. */ tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim); /* * 周期ハンドラを,CPUロック解除状態で呼び出す. */ saved_ipm = i_get_ipm(); i_unlock_cpu(); LOG_CYC_ENTER(p_cyccb); (*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf); LOG_CYC_LEAVE(p_cyccb); if (!i_sense_lock()) { i_lock_cpu(); } i_set_ipm(saved_ipm); }
ER sta_cyc(ID cycid) { CYCCB *p_cyccb; ER ercd; LOG_STA_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); p_cyccb = get_cyccb(cycid); t_lock_cpu(); if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) { ercd = E_NOEXS; } else { if (p_cyccb->cycsta) { tmevtb_dequeue(&(p_cyccb->tmevtb)); } else { p_cyccb->cycsta = true; } tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cycphs); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_STA_CYC_LEAVE(ercd); return(ercd); }
/* * 周期ハンドラ機能の初期化 */ void initialize_cyclic(void) { uint_t i, j; CYCCB *p_cyccb; CYCINIB *p_cycinib; for (i = 0; i < tnum_scyc; i++) { p_cyccb = &(cyccb_table[i]); p_cyccb->p_cycinib = &(cycinib_table[i]); if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) { p_cyccb->cycsta = true; tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs)); } else { p_cyccb->cycsta = false; } } queue_initialize(&free_cyccb); for (j = 0; i < tnum_cyc; i++, j++) { p_cyccb = &(cyccb_table[i]); p_cycinib = &(acycinib_table[j]); p_cycinib->cycatr = TA_NOEXS; p_cyccb->p_cycinib = ((const CYCINIB *) p_cycinib); queue_insert_prev(&free_cyccb, ((QUEUE *) &(p_cyccb->tmevtb))); } }
void initialize_cyclic(void) { uint_t i; CYCCB *p_cyccb; for (p_cyccb = cyccb_table, i = 0; i < tnum_cyc; p_cyccb++, i++) { p_cyccb->p_cycinib = &(cycinib_table[i]); if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) { p_cyccb->cycsta = true; tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs)); } else { p_cyccb->cycsta = false; } } }
ER_UINT acre_cyc(const T_CCYC *pk_ccyc) { CYCCB *p_cyccb; CYCINIB *p_cycinib; ER ercd; LOG_ACRE_CYC_ENTER(pk_ccyc); CHECK_TSKCTX_UNL(); CHECK_RSATR(pk_ccyc->cycatr, TA_STA); CHECK_ALIGN_FUNC(pk_ccyc->cychdr); CHECK_NONNULL_FUNC(pk_ccyc->cychdr); CHECK_PAR(0 < pk_ccyc->cyctim && pk_ccyc->cyctim <= TMAX_RELTIM); CHECK_PAR(0 <= pk_ccyc->cycphs && pk_ccyc->cycphs <= TMAX_RELTIM); t_lock_cpu(); if (tnum_cyc == 0 || queue_empty(&free_cyccb)) { ercd = E_NOID; } else { p_cyccb = ((CYCCB *)(((char *) queue_delete_next(&free_cyccb)) - offsetof(CYCCB, tmevtb))); p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib); p_cycinib->cycatr = pk_ccyc->cycatr; p_cycinib->exinf = pk_ccyc->exinf; p_cycinib->cychdr = pk_ccyc->cychdr; p_cycinib->cyctim = pk_ccyc->cyctim; p_cycinib->cycphs = pk_ccyc->cycphs; if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) { p_cyccb->cycsta = true; tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cycphs); } else { p_cyccb->cycsta = false; } ercd = CYCID(p_cyccb); } t_unlock_cpu(); error_exit: LOG_ACRE_CYC_LEAVE(ercd); return(ercd); }
void cyclic_initialize() { UINT i; CYCCB *cyccb; for (cyccb = cyccb_table, i = 0; i < TNUM_CYC; cyccb++, i++) { cyccb->cycinib = &(cycinib_table[i]); if ((cyccb->cycinib->cycatr & TA_STA) != 0) { cyccb->cycsta = TRUE; tmevtb_enqueue_cyc(cyccb, (EVTTIM)(cyccb->cycinib->cycphs)); } else { cyccb->cycsta = FALSE; } } }
void call_cychdr(CYCCB *cyccb) { /* * 次回の起動のためのタイムイベントブロックを登録する. * * 同じタイムティックで周期ハンドラを再度起動すべき場合には, * この関数から isig_tim に戻った後に,再度この関数が呼ばれる * ことになる. */ tmevtb_enqueue_cyc(cyccb, cyccb->evttim + cyccb->cycinib->cyctim); /* * 周期ハンドラを,CPUロック解除状態で呼び出す. */ i_unlock_cpu(); LOG_CYC_ENTER(cyccb); (*((CYCHDR)(cyccb->cycinib->cychdr)))(cyccb->cycinib->exinf); LOG_CYC_LEAVE(cyccb); i_lock_cpu(); }