ER_UINT acre_alm(const T_CALM *pk_calm) { ALMCB *p_almcb; ALMINIB *p_alminib; ER ercd; LOG_ACRE_ALM_ENTER(pk_calm); CHECK_TSKCTX_UNL(); CHECK_RSATR(pk_calm->almatr, TA_NULL); CHECK_ALIGN_FUNC(pk_calm->almhdr); CHECK_NONNULL_FUNC(pk_calm->almhdr); t_lock_cpu(); if (tnum_alm == 0 || queue_empty(&free_almcb)) { ercd = E_NOID; } else { p_almcb = ((ALMCB *)(((char *) queue_delete_next(&free_almcb)) - offsetof(ALMCB, tmevtb))); p_alminib = (ALMINIB *)(p_almcb->p_alminib); p_alminib->almatr = pk_calm->almatr; p_alminib->exinf = pk_calm->exinf; p_alminib->almhdr = pk_calm->almhdr; p_almcb->almsta = false; ercd = ALMID(p_almcb); } t_unlock_cpu(); error_exit: LOG_ACRE_ALM_LEAVE(ercd); return(ercd); }
ER_UINT acre_isr(const T_CISR *pk_cisr) { ISRCB *p_isrcb; ISRINIB *p_isrinib; QUEUE *p_isr_queue; ER ercd; LOG_ACRE_ISR_ENTER(pk_cisr); CHECK_TSKCTX_UNL(); CHECK_MACV_READ(pk_cisr, T_CISR); CHECK_RSATR(pk_cisr->isratr, TARGET_ISRATR|TA_DOMMASK); CHECK_ATRDOMID_KERNEL(get_atrdomid(pk_cisr->isratr)); CHECK_INTNO_CREISR(pk_cisr->intno); CHECK_ALIGN_FUNC(pk_cisr->isr); CHECK_NONNULL_FUNC(pk_cisr->isr); CHECK_ISRPRI(pk_cisr->isrpri); CHECK_ACPTN(sysstat_acvct.acptn3); p_isr_queue = search_isr_queue(pk_cisr->intno); CHECK_OBJ(p_isr_queue != NULL); t_lock_cpu(); if (tnum_isr == 0 || queue_empty(&free_isrcb)) { ercd = E_NOID; } else { p_isrcb = ((ISRCB *) queue_delete_next(&free_isrcb)); p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib); p_isrinib->isratr = pk_cisr->isratr; p_isrinib->exinf = pk_cisr->exinf; p_isrinib->intno = pk_cisr->intno; p_isrinib->p_isr_queue = p_isr_queue; p_isrinib->isr = pk_cisr->isr; p_isrinib->isrpri = pk_cisr->isrpri; p_isrinib->acvct.acptn1 = TACP_KERNEL; p_isrinib->acvct.acptn2 = TACP_KERNEL; p_isrinib->acvct.acptn3 = TACP_KERNEL | rundom; p_isrinib->acvct.acptn4 = TACP_KERNEL; enqueue_isr(p_isr_queue, p_isrcb); ercd = ISRID(p_isrcb); } t_unlock_cpu(); error_exit: LOG_ACRE_ISR_LEAVE(ercd); return(ercd); }
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); }
ER_UINT acre_isr(const T_CISR *pk_cisr) { ISRCB *p_isrcb; ISRINIB *p_isrinib; QUEUE *p_isr_queue; ER ercd; LOG_ACRE_ISR_ENTER(pk_cisr); CHECK_TSKCTX_UNL(); CHECK_RSATR(pk_cisr->isratr, TARGET_ISRATR); CHECK_INTNO_CREISR(pk_cisr->intno); CHECK_ALIGN_FUNC(pk_cisr->isr); CHECK_NONNULL_FUNC(pk_cisr->isr); CHECK_ISRPRI(pk_cisr->isrpri); p_isr_queue = search_isr_queue(pk_cisr->intno); CHECK_OBJ(p_isr_queue != NULL); t_lock_cpu(); if (tnum_isr == 0 || queue_empty(&free_isrcb)) { ercd = E_NOID; } else { p_isrcb = ((ISRCB *) queue_delete_next(&free_isrcb)); p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib); p_isrinib->isratr = pk_cisr->isratr; p_isrinib->exinf = pk_cisr->exinf; p_isrinib->intno = pk_cisr->intno; p_isrinib->p_isr_queue = p_isr_queue; p_isrinib->isr = pk_cisr->isr; p_isrinib->isrpri = pk_cisr->isrpri; enqueue_isr(p_isr_queue, p_isrcb); ercd = ISRID(p_isrcb); } t_unlock_cpu(); error_exit: LOG_ACRE_ISR_LEAVE(ercd); return(ercd); }
ER_UINT acre_tsk(const T_CTSK *pk_ctsk) { ID domid; const DOMINIB *p_dominib; TCB *p_tcb; TINIB *p_tinib; ATR tskatr; SIZE sstksz, ustksz; void *sstk, *ustk; ACPTN acptn; ER ercd; LOG_ACRE_TSK_ENTER(pk_ctsk); CHECK_TSKCTX_UNL(); CHECK_MACV_READ(pk_ctsk, T_CTSK); CHECK_RSATR(pk_ctsk->tskatr, TA_ACT|TARGET_TSKATR|TA_DOMMASK); domid = get_atrdomid(pk_ctsk->tskatr); CHECK_ATRDOMID_ACTIVE(domid); CHECK_ALIGN_FUNC(pk_ctsk->task); CHECK_NONNULL_FUNC(pk_ctsk->task); CHECK_TPRI(pk_ctsk->itskpri); p_dominib = (domid == TDOM_SELF) ? p_runtsk->p_tinib->p_dominib : (domid == TDOM_KERNEL) ? &dominib_kernel : get_dominib(domid); if (p_dominib == &dominib_kernel) { /* * システムタスクの場合 */ ustksz = 0U; ustk = NULL; CHECK_PAR(pk_ctsk->sstk == NULL); CHECK_PAR(pk_ctsk->stksz > 0U); sstksz = pk_ctsk->stksz; sstk = pk_ctsk->stk; if (sstk != NULL) { CHECK_PAR(pk_ctsk->sstksz == 0U); } else { sstksz += pk_ctsk->sstksz; } } else { /* * ユーザタスクの場合 */ ustksz = pk_ctsk->stksz; ustk = pk_ctsk->stk; CHECK_PAR(ustksz >= TARGET_MIN_USTKSZ); CHECK_NOSPT(ustk != NULL); CHECK_TARGET_USTACK(ustksz, ustk, p_dominib); sstksz = pk_ctsk->sstksz; sstk = pk_ctsk->sstk; } CHECK_PAR(sstksz >= TARGET_MIN_SSTKSZ); if (sstk != NULL) { CHECK_ALIGN_STKSZ(sstksz); CHECK_ALIGN_STACK(sstk); } CHECK_ACPTN(sysstat_acvct.acptn3); tskatr = pk_ctsk->tskatr; t_lock_cpu(); if (queue_empty(&free_tcb)) { ercd = E_NOID; } else { if (sstk == NULL) { sstk = kernel_malloc(ROUND_STK_T(sstksz)); tskatr |= TA_MEMALLOC; } if (sstk == NULL) { ercd = E_NOMEM; } else { p_tcb = ((TCB *) queue_delete_next(&free_tcb)); p_tinib = (TINIB *)(p_tcb->p_tinib); p_tinib->p_dominib = p_dominib; p_tinib->tskatr = tskatr; p_tinib->exinf = pk_ctsk->exinf; p_tinib->task = pk_ctsk->task; p_tinib->ipriority = INT_PRIORITY(pk_ctsk->itskpri); #ifdef USE_TSKINICTXB init_tskinictxb(&(p_tinib->tskinictxb), p_dominib, sstksz, sstk, utsksz, ustk, pk_ctsk); #else /* USE_TSKINICTXB */ p_tinib->sstksz = sstksz; p_tinib->sstk = sstk; p_tinib->ustksz = ustksz; p_tinib->ustk = ustk; #endif /* USE_TSKINICTXB */ p_tinib->texatr = TA_NULL; p_tinib->texrtn = NULL; acptn = default_acptn(domid); p_tinib->acvct.acptn1 = acptn; p_tinib->acvct.acptn2 = acptn; p_tinib->acvct.acptn3 = acptn | rundom; p_tinib->acvct.acptn4 = acptn; p_tcb->actque = false; make_dormant(p_tcb); queue_initialize(&(p_tcb->mutex_queue)); if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) { make_active(p_tcb); } ercd = TSKID(p_tcb); } } t_unlock_cpu(); error_exit: LOG_ACRE_TSK_LEAVE(ercd); return(ercd); }