📄 time_calls.c
字号:
CHECK_CYCID(id); BEGIN_DISABLE_INTERRUPT; cyccb = get_cyccb(id); if ( cyccb->cychdr == NULL ) { ercd = E_NOEXS; goto error_exit; } if ( (cyccb->cycatr & TA_DSNAME) == 0 ) { ercd = E_OBJ; goto error_exit; } *name = cyccb->name; error_exit: END_DISABLE_INTERRUPT; return ercd;}#endif /* USE_OBJECT_NAME */#endif /* USE_FUNC_CYCLICHANDLER_GETNAME */#ifdef USE_FUNC_TD_LST_CYC/* * Refer cyclic handler usage state */SYSCALL INT td_lst_cyc_impl( ID list[], INT nent ){ CYCCB *cyccb, *end; INT n = 0; BEGIN_DISABLE_INTERRUPT; end = knl_cyccb_table + NUM_CYCID; for ( cyccb = knl_cyccb_table; cyccb < end; cyccb++ ) { /* Unregistered handler */ if ( cyccb->cychdr == NULL ) { continue; } if ( n++ < nent ) { *list++ = ID_CYC(cyccb - knl_cyccb_table); } } END_DISABLE_INTERRUPT; return n;}#endif /* USE_FUNC_TD_LST_CYC */#ifdef USE_FUNC_TD_REF_CYC/* * Refer cyclic handler state */SYSCALL ER td_ref_cyc_impl( ID cycid, TD_RCYC* pk_rcyc ){ CYCCB *cyccb; LSYSTIM tm; ER ercd = E_OK; CHECK_CYCID(cycid); cyccb = get_cyccb(cycid); BEGIN_DISABLE_INTERRUPT; if ( cyccb->cychdr == NULL ) { /* Unregistered handler */ ercd = E_NOEXS; } else { tm = cyccb->cyctmeb.time; if ( (cyccb->cycstat & TCYC_STA) == 0 ) { if ( ll_cmp(tm, knl_current_time) <= 0 ) { tm = knl_cyc_next_time(cyccb); } } tm = ll_sub(tm, knl_current_time); tm = ll_sub(tm, uitoll(CFN_TIMER_PERIOD)); if ( ll_sign(tm) < 0 ) { tm = ltoll(0); } pk_rcyc->exinf = cyccb->exinf; pk_rcyc->lfttim = lltoul(tm); pk_rcyc->cycstat = cyccb->cycstat; } END_DISABLE_INTERRUPT; return ercd;}#endif /* USE_FUNC_TD_REF_CYC */#endif /* USE_DBGSPT */#endif /* CFN_MAX_CYCID *//* ------------------------------------------------------------------------ *//* * Alarm handler */#if CFN_MAX_ALMID > 0#ifdef USE_FUNC_ALMCB_TABLENoinit(EXPORT ALMCB knl_almcb_table[NUM_ALMID]); /* Alarm handler control block */Noinit(EXPORT QUEUE knl_free_almcb); /* FreeQue */#endif /* USE_FUNC_ALMCB_TABLE */#ifdef USE_FUNC_ALARMHANDLER_INITIALIZE/* * Initialization of alarm handler control block */EXPORT ER knl_alarmhandler_initialize( void ){ ALMCB *almcb, *end; /* Get system information */ if ( NUM_ALMID < 1 ) { return E_SYS; } /* Register all control blocks onto FreeQue */ QueInit(&knl_free_almcb); end = knl_almcb_table + NUM_ALMID; for ( almcb = knl_almcb_table; almcb < end; almcb++ ) { almcb->almhdr = NULL; /* Unregistered handler */ QueInsert((QUEUE*)almcb, &knl_free_almcb); } return E_OK;}#endif /* USE_FUNC_ALARMHANDLER_INITIALIZE */#ifdef USE_FUNC_CALL_ALMHDR/* * Alarm handler start routine */EXPORT void knl_call_almhdr( ALMCB *almcb ){ almcb->almstat &= ~TALM_STA; /* Execute alarm handler/ Enable interrupt nesting */ ENABLE_INTERRUPT_UPTO(TIMER_INTLEVEL); CallUserHandlerP1(almcb->exinf, almcb->almhdr, almcb); DISABLE_INTERRUPT;}#endif /* USE_FUNC_CALL_ALMHDR */#ifdef USE_FUNC_TK_CRE_ALM/* * Create alarm handler */SYSCALL ID tk_cre_alm_impl P1( T_CALM *pk_calm ){ const ATR VALID_ALMATR = { TA_HLNG |TA_GP#if USE_OBJECT_NAME |TA_DSNAME#endif }; ALMCB *almcb; ER ercd = E_OK; CHECK_RSATR(pk_calm->almatr, VALID_ALMATR); CHECK_PAR(pk_calm->almhdr != NULL); BEGIN_CRITICAL_SECTION; /* Get control block from free queue */ almcb = (ALMCB*)QueRemoveNext(&knl_free_almcb); if ( almcb == NULL ) { ercd = E_LIMIT; goto error_exit; } /* Initialize control block */ almcb->exinf = pk_calm->exinf; almcb->almatr = pk_calm->almatr; almcb->almhdr = pk_calm->almhdr; almcb->almstat = TALM_STP;#if USE_OBJECT_NAME if ( (pk_calm->almatr & TA_DSNAME) != 0 ) { strncpy((char*)almcb->name, (char*)pk_calm->dsname, OBJECT_NAME_LENGTH); }#endif#if TA_GP if ( (pk_calm->almatr & TA_GP) != 0 ) { gp = pk_calm->gp; } almcb->gp = gp;#endif ercd = ID_ALM(almcb - knl_almcb_table); error_exit: END_CRITICAL_SECTION; return ercd;}#endif /* USE_FUNC_TK_CRE_ALM */#ifdef USE_FUNC_TK_DEL_ALM/* * Delete alarm handler */SYSCALL ER tk_del_alm_impl( ID almid ){ ALMCB *almcb; ER ercd = E_OK; CHECK_ALMID(almid); almcb = get_almcb(almid); BEGIN_CRITICAL_SECTION; if ( almcb->almhdr == NULL ) { /* Unregistered handler */ ercd = E_NOEXS; } else { if ( (almcb->almstat & TALM_STA) != 0 ) { /* Delete from timer event queue */ knl_timer_delete(&almcb->almtmeb); } /* Return to FreeQue */ QueInsert((QUEUE*)almcb, &knl_free_almcb); almcb->almhdr = NULL; /* Unregistered handler */ } END_CRITICAL_SECTION; return ercd;}#endif /* USE_FUNC_TK_DEL_ALM */#ifdef USE_FUNC_TK_STA_ALM/* * Alarm handler immediate call */LOCAL void knl_immediate_call_almhdr( ALMCB *almcb ){ almcb->almstat &= ~TALM_STA; /* Execute alarm handler in task-independent part (Keep interrupt disabled) */ ENTER_TASK_INDEPENDENT; CallUserHandlerP1(almcb->exinf, almcb->almhdr, almcb); LEAVE_TASK_INDEPENDENT;}/* * Start alarm handler */SYSCALL ER tk_sta_alm_impl( ID almid, RELTIM almtim ){ ALMCB *almcb; ER ercd = E_OK; CHECK_ALMID(almid); almcb = get_almcb(almid); BEGIN_CRITICAL_SECTION; if ( almcb->almhdr == NULL ) { /* Unregistered handler */ ercd = E_NOEXS; goto error_exit; } if ( (almcb->almstat & TALM_STA) != 0 ) { /* Cancel current settings */ knl_timer_delete(&almcb->almtmeb); } if ( almtim > 0 ) { /* Register onto timer event queue */ knl_alm_timer_insert(almcb, almtim); almcb->almstat |= TALM_STA; } else { /* Immediate execution */ knl_immediate_call_almhdr(almcb); } error_exit: END_CRITICAL_SECTION; return ercd;}#endif /* USE_FUNC_TK_STA_ALM */#ifdef USE_FUNC_TK_STP_ALM/* * Stop alarm handler */SYSCALL ER tk_stp_alm_impl( ID almid ){ ALMCB *almcb; ER ercd = E_OK; CHECK_ALMID(almid); almcb = get_almcb(almid); BEGIN_CRITICAL_SECTION; if ( almcb->almhdr == NULL ) { /* Unregistered handler */ ercd = E_NOEXS; } else { if ( (almcb->almstat & TALM_STA) != 0 ) { /* Stop alarm handler address */ knl_timer_delete(&almcb->almtmeb); almcb->almstat &= ~TALM_STA; } } END_CRITICAL_SECTION; return ercd;}#endif /* USE_FUNC_TK_STP_ALM */#ifdef USE_FUNC_TK_REF_ALM/* * Refer alarm handler state */SYSCALL ER tk_ref_alm_impl( ID almid, T_RALM *pk_ralm ){ ALMCB *almcb; LSYSTIM tm; ER ercd = E_OK; CHECK_ALMID(almid); almcb = get_almcb(almid); BEGIN_CRITICAL_SECTION; if ( almcb->almhdr == NULL ) { /* Unregistered handler */ ercd = E_NOEXS; } else { if ( (almcb->almstat & TALM_STA) != 0 ) { tm = almcb->almtmeb.time; tm = ll_sub(tm, knl_current_time); tm = ll_sub(tm, uitoll(CFN_TIMER_PERIOD)); if ( ll_sign(tm) < 0 ) { tm = ltoll(0); } } else { tm = ltoll(0); } pk_ralm->exinf = almcb->exinf; pk_ralm->lfttim = lltoul(tm); pk_ralm->almstat = almcb->almstat; } END_CRITICAL_SECTION; return ercd;}#endif /* USE_FUNC_TK_REF_ALM */#if USE_DBGSPT#ifdef USE_FUNC_ALARMHANDLER_GETNAME#if USE_OBJECT_NAME/* * Get object name from control block */EXPORT ER knl_alarmhandler_getname(ID id, UB **name){ ALMCB *almcb; ER ercd = E_OK; CHECK_ALMID(id); BEGIN_DISABLE_INTERRUPT; almcb = get_almcb(id); if ( almcb->almhdr == NULL ) { ercd = E_NOEXS; goto error_exit; } if ( (almcb->almatr & TA_DSNAME) == 0 ) { ercd = E_OBJ; goto error_exit; } *name = almcb->name; error_exit: END_DISABLE_INTERRUPT; return ercd;}#endif /* USE_OBJECT_NAME */#endif /* USE_FUNC_ALARMHANDLER_GETNAME */#ifdef USE_FUNC_TD_LST_ALM/* * Refer alarm handler usage state */SYSCALL INT td_lst_alm_impl( ID list[], INT nent ){ ALMCB *almcb, *end; INT n = 0; BEGIN_DISABLE_INTERRUPT; end = knl_almcb_table + NUM_ALMID; for ( almcb = knl_almcb_table; almcb < end; almcb++ ) { /* Unregistered handler */ if ( almcb->almhdr == NULL ) { continue; } if ( n++ < nent ) { *list++ = ID_ALM(almcb - knl_almcb_table); } } END_DISABLE_INTERRUPT; return n;}#endif /* USE_FUNC_TD_LST_ALM */#ifdef USE_FUNC_TD_REF_ALM/* * Refer alarm handler state */SYSCALL ER td_ref_alm_impl( ID almid, TD_RALM *pk_ralm ){ ALMCB *almcb; LSYSTIM tm; ER ercd = E_OK; CHECK_ALMID(almid); almcb = get_almcb(almid); BEGIN_DISABLE_INTERRUPT; if ( almcb->almhdr == NULL ) { /* Unregistered handler */ ercd = E_NOEXS; } else { if ( (almcb->almstat & TALM_STA) != 0 ) { tm = almcb->almtmeb.time; tm = ll_sub(tm, knl_current_time); tm = ll_sub(tm, uitoll(CFN_TIMER_PERIOD)); if ( ll_sign(tm) < 0 ) { tm = ltoll(0); } } else { tm = ltoll(0); } pk_ralm->exinf = almcb->exinf; pk_ralm->lfttim = lltoul(tm); pk_ralm->almstat = almcb->almstat; } END_DISABLE_INTERRUPT; return ercd;}#endif /* USE_FUNC_TD_REF_ALM */#endif /* USE_DBGSPT */#endif /* CFN_MAX_ALMID */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -