⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uit_func.inl

📁 ecos为实时嵌入式操作系统
💻 INL
📖 第 1 页 / 共 4 页
字号:
{    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 + -