📄 uit_func.inl
字号:
{ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); Cyg_Scheduler::lock(); // deal with the race condition here if ( p != CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] ) { Cyg_Scheduler::unlock(); return E_NOEXS; } CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] = NULL; p->~Cyg_Flag(); Cyg_Scheduler::unlock(); return E_OK;}#endif // CYGPKG_UITRON_FLAGS_CREATE_DELETECYG_UIT_FUNC_INLINEERset_flg ( ID flgid, UINT setptn ){ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); p->setbits( setptn ); return E_OK;}CYG_UIT_FUNC_INLINEERclr_flg ( ID flgid, UINT clrptn ){ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); p->maskbits( clrptn ); return E_OK;}CYG_UIT_FUNC_INLINEERwai_flg ( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode ){ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); CYG_UIT_PARAMCHECK_PTR( p_flgptn ); CYG_UIT_PARAMCHECK( 0 == (wfmode & ~Cyg_Flag::MASK), E_PAR ); CYG_UIT_PARAMCHECK( 0 != waiptn, E_PAR ); CYG_UITRON_CHECK_DISPATCH_ENABLED(); // check we can use the wfmode value unchanged CYG_ASSERT( Cyg_Flag::AND == TWF_ANDW, "Flag AND value bad" ); CYG_ASSERT( Cyg_Flag::OR == TWF_ORW, "Flag OR value bad" ); CYG_ASSERT( Cyg_Flag::CLR == TWF_CLR, "Flag CLR value bad" ); UINT result = p->wait( waiptn, wfmode ); if ( ! result ) CYG_UITRON_FAIL_RETURN(); *p_flgptn = result; return E_OK;}CYG_UIT_FUNC_INLINEERpol_flg ( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode ){ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); CYG_UIT_PARAMCHECK_PTR( p_flgptn ); CYG_UIT_PARAMCHECK( 0 == (wfmode & ~Cyg_Flag::MASK), E_PAR ); CYG_UIT_PARAMCHECK( 0 != waiptn, E_PAR ); // check we can use the wfmode value unchanged CYG_ASSERT( Cyg_Flag::AND == TWF_ANDW, "Flag AND value bad" ); CYG_ASSERT( Cyg_Flag::OR == TWF_ORW, "Flag OR value bad" ); CYG_ASSERT( Cyg_Flag::CLR == TWF_CLR, "Flag CLR value bad" ); UINT result = p->poll( waiptn, wfmode ); if ( ! result ) return E_TMOUT; *p_flgptn = result; return E_OK;}#ifdef CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERtwai_flg ( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode, TMO tmout ){ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); CYG_UIT_PARAMCHECK_PTR( p_flgptn ); CYG_UIT_PARAMCHECK( 0 == (wfmode & ~Cyg_Flag::MASK), E_PAR ); CYG_UIT_PARAMCHECK( 0 != waiptn, E_PAR ); CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout ); // check we can use the wfmode value unchanged CYG_ASSERT( Cyg_Flag::AND == TWF_ANDW, "Flag AND value bad" ); CYG_ASSERT( Cyg_Flag::OR == TWF_ORW, "Flag OR value bad" ); CYG_ASSERT( Cyg_Flag::CLR == TWF_CLR, "Flag CLR value bad" ); // do this now for the case when no sleeping actually occurs Cyg_Thread *self = Cyg_Thread::self(); self->set_wake_reason( Cyg_Thread::TIMEOUT ); UINT result; if ( TMO_FEVR == tmout ) result = p->wait( waiptn, wfmode ); else if ( TMO_POL == tmout ) result = p->poll( waiptn, wfmode ); else result = p->wait( waiptn, wfmode, Cyg_Clock::real_time_clock->current_value() + (cyg_tick_count)tmout ); if ( ! result ) CYG_UITRON_FAIL_RETURN_SELF( self ); *p_flgptn = result; return E_OK;}#endif // CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERref_flg ( T_RFLG *pk_rflg, ID flgid ){ Cyg_Flag *p; CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); CYG_UIT_PARAMCHECK_PTR( pk_rflg ); pk_rflg->exinf = NADR; pk_rflg->wtsk = p->waiting(); pk_rflg->flgptn = p->peek(); return E_OK;}#endif // 0 < CYG_UITRON_NUM( FLAGS )#endif // CYGPKG_UITRON_FLAGS#ifdef CYGPKG_UITRON_MBOXES#if 0 < CYG_UITRON_NUM( MBOXES )#ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETECYG_UITRON_NEWFUNCTION( Cyg_Mbox )CYG_UIT_FUNC_INLINEERcre_mbx ( ID mbxid, T_CMBX* pk_cmbx ){ ER ret = E_OK; CYG_UIT_PARAMCHECK_PTR( pk_cmbx ); CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( MBOXES, mbxid ); if ( ((ATR)(TA_TFIFO + TA_MFIFO)) != pk_cmbx->mbxatr ) ret = E_RSATR; else CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] = new( &(CYG_UITRON_OBJS( MBOXES )[ mbxid - 1 ]) ) Cyg_Mbox(); Cyg_Scheduler::unlock(); return ret;}CYG_UIT_FUNC_INLINEERdel_mbx ( ID mbxid ){ Cyg_Mbox *p; CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); Cyg_Scheduler::lock(); // deal with the race condition here if ( p != CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] ) { Cyg_Scheduler::unlock(); return E_NOEXS; } CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] = NULL; p->~Cyg_Mbox(); Cyg_Scheduler::unlock(); return E_OK;}#endif // CYGPKG_UITRON_MBOXES_CREATE_DELETE// This bit of unpleasantness is to allow uITRON programs to send a NULL// message - if permitted by the parameter checking.// // NULL is used internally to mean no message; but -1 is fine. So we send// a NULL as a NADR and if we see a NULL coming back, change it to a NADR.//// One hopes that often this will be optimized out, since the one or both// of these being true has been detected and errored out just above.#ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR// represent a NULL as NADR internally#define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_MACRO_START \ if ( NULL == (_p_) ) \ (_p_) = (T_MSG *)NADR; \CYG_MACRO_END// we get a NADR back sometimes, meaning NULL#define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_MACRO_START \ if ( NADR == (_p_) ) \ (_p_) = (T_MSG *)NULL; \CYG_MACRO_END#else// NULL is checked for and makes an error#define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_EMPTY_STATEMENT#define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_EMPTY_STATEMENT#endif// and sometimes either in status enquiries#define CYG_UIT_TMSG_FIXUP_ALL( _p_ ) CYG_MACRO_START \ if ( NULL == (_p_) ) \ (_p_) = (T_MSG *)NADR; \ else if ( NADR == (_p_) ) \ (_p_) = (T_MSG *)NULL; \CYG_MACRO_ENDCYG_UIT_FUNC_INLINEERsnd_msg ( ID mbxid, T_MSG *pk_msg ){ Cyg_Mbox *p; CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); CYG_UIT_PARAMCHECK_PTR( pk_msg ); CYG_UIT_TMSG_FIXUP_IN( pk_msg ); cyg_bool result = p->tryput( (void *)pk_msg ); if ( ! result ) return E_QOVR; return E_OK;}CYG_UIT_FUNC_INLINEERrcv_msg ( T_MSG **ppk_msg, ID mbxid ){ Cyg_Mbox *p; CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); CYG_UIT_PARAMCHECK_PTR( ppk_msg ); CYG_UITRON_CHECK_DISPATCH_ENABLED(); T_MSG *result = (T_MSG *)p->get(); if ( ! result ) CYG_UITRON_FAIL_RETURN(); CYG_UIT_TMSG_FIXUP_OUT( result ); *ppk_msg = result; return E_OK;}CYG_UIT_FUNC_INLINEERprcv_msg ( T_MSG **ppk_msg, ID mbxid ){ Cyg_Mbox *p; CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); CYG_UIT_PARAMCHECK_PTR( ppk_msg ); T_MSG *result = (T_MSG *)p->tryget(); if ( ! result ) return E_TMOUT; CYG_UIT_TMSG_FIXUP_OUT( result ); *ppk_msg = result; return E_OK;}#ifdef CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERtrcv_msg ( T_MSG **ppk_msg, ID mbxid, TMO tmout ){ Cyg_Mbox *p; CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); CYG_UIT_PARAMCHECK_PTR( ppk_msg ); CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout ); // do this now for the case when no sleeping actually occurs Cyg_Thread *self = Cyg_Thread::self(); self->set_wake_reason( Cyg_Thread::TIMEOUT ); T_MSG *result; if ( TMO_FEVR == tmout ) result = (T_MSG *)p->get(); else if ( TMO_POL == tmout ) result = (T_MSG *)p->tryget(); else result = (T_MSG *)p->get( Cyg_Clock::real_time_clock->current_value() + (cyg_tick_count)tmout ); if ( ! result ) CYG_UITRON_FAIL_RETURN_SELF( self ); CYG_UIT_TMSG_FIXUP_OUT( result ); *ppk_msg = result; return E_OK;}#endif // CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERref_mbx ( T_RMBX *pk_rmbx, ID mbxid ){ Cyg_Mbox *p; CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); CYG_UIT_PARAMCHECK_PTR( pk_rmbx ); pk_rmbx->exinf = NADR; pk_rmbx->wtsk = p->waiting_to_get(); pk_rmbx->pk_msg = (T_MSG *)p->peek_item(); CYG_UIT_TMSG_FIXUP_ALL( pk_rmbx->pk_msg ); return E_OK;}#undef CYG_UIT_TMSG_FIXUP_IN#undef CYG_UIT_TMSG_FIXUP_OUT#undef CYG_UIT_TMSG_FIXUP_ALL #endif // 0 < CYG_UITRON_NUM( MBOXES )#endif // CYGPKG_UITRON_MBOXES// - Extended Synchronization and Communication Functions #if 0 // NOT SUPPORTEDER cre_mbf ( ID mbfid, T_CMBF *pk_cmbf );ER del_mbf ( ID mbfid );ER snd_mbf ( ID mbfid, VP msg, INT msgsz );ER psnd_mbf ( ID mbfid, VP msg, INT msgsz );ER tsnd_mbf ( ID mbfid, VP msg, INT msgsz, TMO tmout );ER rcv_mbf ( VP msg, INT *p_msgsz, ID mbfid );ER prcv_mbf ( VP msg, INT *p_msgsz, ID mbfid );ER trcv_mbf ( VP msg, INT *p_msgsz, ID mbfid, TMO tmout );ER ref_mbf ( T_RMBF *pk_rmbf, ID mbfid );ER cre_por ( ID porid, T_CPOR *pk_cpor );ER del_por ( ID porid );ER cal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT cmsgsz );ER pcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT cmsgsz );ER tcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT cmsgsz, TMO tmout );ER acp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT acpptn );ER pacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT acpptn );ER tacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT acpptn, TMO tmout );ER fwd_por ( ID porid, UINT calptn, RNO rdvno, VP msg, INT cmsgsz );ER rpl_rdv ( RNO rdvno, VP msg, INT rmsgsz );ER ref_por ( T_RPOR *pk_rpor, ID porid );#endif // - Interrupt Management Functions #if 0 // NOT SUPPORTEDER def_int ( UINT dintno, T_DINT *pk_dint );void ret_wup ( ID tskid );#endifCYG_UIT_FUNC_INLINEERloc_cpu ( void ){ CYG_UITRON_CHECK_TASK_CONTEXT(); Cyg_Scheduler::lock(); // Prevent preemption by going up to prio 0 if ( 0 == cyg_uitron_dis_dsp_old_priority ) {#ifdef CYGIMP_THREAD_PRIORITY Cyg_Thread *p = Cyg_Thread::self(); cyg_uitron_dis_dsp_old_priority = p->get_priority(); p->set_priority( 0 );#else cyg_uitron_dis_dsp_old_priority = 1;#endif } Cyg_Interrupt::disable_interrupts(); Cyg_Scheduler::unlock(); return E_OK;}CYG_UIT_FUNC_INLINEERunl_cpu ( void ){ CYG_UITRON_CHECK_TASK_CONTEXT(); Cyg_Scheduler::lock(); // Enable dispatching (if disabled) and maybe switch threads if ( 0 != cyg_uitron_dis_dsp_old_priority ) { // We had prevented preemption by going up to prio 0#ifdef CYGIMP_THREAD_PRIORITY Cyg_Thread *p = Cyg_Thread::self(); p->set_priority( cyg_uitron_dis_dsp_old_priority );#endif cyg_uitron_dis_dsp_old_priority = 0; } Cyg_Interrupt::enable_interrupts(); Cyg_Scheduler::unlock(); CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards! return E_OK;}#if 0 // NOT SUPPORTEDER dis_int ( UINT eintno );ER ena_int ( UINT eintno );ER chg_iXX ( UINT iXXXX );ER ref_iXX ( UINT *p_iXXXX );#endif // - Memorypool Management Functions#ifdef CYGPKG_UITRON_MEMPOOLVAR#if 0 < CYG_UITRON_NUM( MEMPOOLVAR )#ifdef CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETECYG_UITRON_NEWFUNCTION( Cyg_Mempool_Variable )CYG_UIT_FUNC_INLINEERcre_mpl ( ID mplid, T_CMPL *pk_cmpl ){ ER ret = E_OK; CYG_UIT_PARAMCHECK_PTR( pk_cmpl ); CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( MEMPOOLVAR, mplid ); Cyg_Mempool_Variable *p = &(CYG_UITRON_OBJS( MEMPOOLVAR )[ mplid - 1 ]); cyg_uint8 *base; cyg_int32 size; CYG_ADDRWORD scratch; // preserve the original memory area to use p->get_arena( base, size, scratch ); if ( size < pk_cmpl->mplsz ) ret = E_NOMEM; else if ( TA_TFIFO != pk_cmpl->mplatr ) ret = E_RSATR; else CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] = new( p ) Cyg_Mempool_Variable( base, size ); Cyg_Scheduler::unlock(); return ret;}CYG_UIT_FUNC_INLINEERdel_mpl ( ID mplid ){ Cyg_Mempool_Variable *p; CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p ); Cyg_Scheduler::lock(); // deal with the race condition here if ( p != CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] ) { Cyg_Scheduler::unlock(); return E_NOEXS; } CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] = NULL; p->~Cyg_Mempool_Variable(); Cyg_Scheduler::unlock(); return E_OK;}#endif // CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETECYG_UIT_FUNC_INLINEERget_blk ( VP *p_blk, ID mplid, INT blksz ){ Cyg_Mempool_Variable *p; CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p ); CYG_UIT_PARAMCHECK_PTR( p_blk ); CYG_UIT_PARAMCHECK( blksz > 0, E_PAR ); CYG_UITRON_CHECK_DISPATCH_ENABLED(); VP result = (VP)p->alloc(blksz); if ( ! result ) CYG_UITRON_FAIL_RETURN(); *p_blk = result; return E_OK;}CYG_UIT_FUNC_INLINE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -