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

📄 uit_func.inl

📁 ecos为实时嵌入式操作系统
💻 INL
📖 第 1 页 / 共 4 页
字号:
ERena_dsp ( void ){    CYG_UITRON_CHECK_TASK_CONTEXT();    CYG_UITRON_CHECK_CPU_UNLOC();    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 );        p->to_queue_head(); // to ensure we continue to run                            // if nobody higher pri#endif        cyg_uitron_dis_dsp_old_priority = 0;    }    Cyg_Scheduler::unlock();    CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards!    return E_OK;}CYG_UIT_FUNC_INLINEERchg_pri ( ID tskid, PRI tskpri ){    Cyg_Thread *p;    ER ret = E_OK;    if ( 0 == tskid ) {        p = Cyg_Thread::self();        CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );    }    else        CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK( 0 < tskpri, E_PAR );#ifdef CYGIMP_THREAD_PRIORITY#if CYG_THREAD_MAX_PRIORITY < CYG_THREAD_MIN_PRIORITY    CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY <= tskpri &&                        tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR );#else        CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri &&                        tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR );#endif    // Handle changing our own prio specially, if dispatch disabled:    if ( 0 != cyg_uitron_dis_dsp_old_priority ) {        // our actual prio is 0 now and must remain so:        if ( Cyg_Thread::self() == p ) {  // by whichever route p was set            // set the priority we will return to when dispatch is enabled:            cyg_uitron_dis_dsp_old_priority = (cyg_uint32)tskpri;            return E_OK;        }    }    Cyg_Scheduler::lock();    if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||         (Cyg_Thread::EXIT == p->get_wake_reason()) )        ret = E_OBJ; // task is dormant    else        p->set_priority( (cyg_priority)tskpri );    Cyg_Scheduler::unlock();#endif // CYGIMP_THREAD_PRIORITY got priorities at all?    return ret;}CYG_UIT_FUNC_INLINEERrot_rdq ( PRI tskpri ){    // zero means our level; easiet way is to yield() the CPU.    if ( 0 == tskpri ) {        Cyg_Thread::yield();        return E_OK;    }#ifdef CYGIMP_THREAD_PRIORITY#if CYG_THREAD_MAX_PRIORITY < CYG_THREAD_MIN_PRIORITY    CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY <= tskpri &&                        tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR );#else        CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri &&                        tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR );#endif    Cyg_Thread::rotate_queue( tskpri );#endif // CYGIMP_THREAD_PRIORITY got priorities at all?    return E_OK;}CYG_UIT_FUNC_INLINEERrel_wai ( ID tskid ){    Cyg_Thread *p;    ER ret = E_OK;    CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );    Cyg_Scheduler::lock();              // get an atomic view of the task    if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||         (Cyg_Thread::EXIT == p->get_wake_reason()) )        ret = E_OBJ;                    // task is dormant    else {        p->release();        // return E_OBJ if the thread was not sleeping        if ( Cyg_Thread::BREAK != p->get_wake_reason() )            ret = E_OBJ;    }    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERget_tid ( ID *p_tskid ){    Cyg_Thread *self = Cyg_Thread::self();    CYG_UIT_PARAMCHECK_PTR( p_tskid );    if ( (&cyg_uitron_TASKS[0] <= (self)) &&        ((self) < &cyg_uitron_TASKS[CYGNUM_UITRON_TASKS]) )        // then I am a uITRON task        *p_tskid = (self - (&cyg_uitron_TASKS[0])) + 1;    else        *p_tskid = 0; // Otherwise, non-task portion    return E_OK;}CYG_UIT_FUNC_INLINEERref_tsk ( T_RTSK *pk_rtsk, ID tskid ){    Cyg_Thread *p;    if ( 0 == tskid ) {        p = Cyg_Thread::self();        CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );        tskid = (p - (&cyg_uitron_TASKS[0])) + 1; // it gets used below    }    else        CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK_PTR( pk_rtsk );    pk_rtsk->exinf  = NADR;    Cyg_Scheduler::lock();              // get an atomic view of the task    cyg_uint32 state = p->get_state();    if ( (state & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||         (Cyg_Thread::EXIT == p->get_wake_reason()) )        pk_rtsk->tskstat = TTS_DMT;    else if ( state == Cyg_Thread::RUNNING )        // If it's us, it's running, else it's ready        pk_rtsk->tskstat = (Cyg_Thread::self() == p)            ? TTS_RUN                   // RUN state (we are it)            : TTS_RDY;                  // READY state    else if ( state & Cyg_Thread::SUSPENDED )        pk_rtsk->tskstat =            (state & (Cyg_Thread::COUNTSLEEP | Cyg_Thread::SLEEPING))            ? TTS_WAS                   // WAIT-SUSPEND state            : TTS_SUS;                  // SUSPEND state    else        pk_rtsk->tskstat =            (state & (Cyg_Thread::COUNTSLEEP | Cyg_Thread::SLEEPING))            ? TTS_WAI                   // WAIT state            : 0;                        // Not sure what's happening here!#ifdef CYGIMP_THREAD_PRIORITY    if ( TTS_DMT == pk_rtsk->tskstat )        pk_rtsk->tskpri = CYG_UITRON_TASK_INITIAL_PRIORITY( tskid );    else if ( (TTS_RUN == pk_rtsk->tskstat) &&               (0 != cyg_uitron_dis_dsp_old_priority) )        // then we are it and dispatching is disabled, so        // report our "real" priority - it is 0 in the kernel at the moment        pk_rtsk->tskpri = cyg_uitron_dis_dsp_old_priority;    else        pk_rtsk->tskpri = p->get_priority();#else    pk_rtsk->tskpri = -1;  // Not applicable#endif    Cyg_Scheduler::unlock();    return E_OK;}        // - Task-Dependent Synchronization Functions        CYG_UIT_FUNC_INLINEERsus_tsk ( ID tskid ){    Cyg_Thread *p;    ER ret = E_OK;    CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );    Cyg_Scheduler::lock();              // get an atomic view of the task    if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||         (Cyg_Thread::EXIT == p->get_wake_reason()) )        ret = E_OBJ;                    // task is dormant    else        p->suspend();    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERrsm_tsk ( ID tskid ){    Cyg_Thread *p;    ER ret = E_OK;    CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );    Cyg_Scheduler::lock();              // get an atomic view of the task    cyg_uint32 state = p->get_state();    if ( 0 == (Cyg_Thread::SUSPENDED & state) )        ret = E_OBJ;                    // thread is not suspended    else        p->resume();    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERfrsm_tsk ( ID tskid ){    Cyg_Thread *p;    ER ret = E_OK;    CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );    Cyg_Scheduler::lock();              // get an atomic view of the task    cyg_uint32 state = p->get_state();    if ( 0 == (Cyg_Thread::SUSPENDED & state) )        ret = E_OBJ;                    // thread is not suspended    else        p->force_resume();    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERslp_tsk ( void ){    Cyg_Thread *self = Cyg_Thread::self();    CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self );    CYG_UITRON_CHECK_DISPATCH_ENABLED();    // do this now for the case when no sleeping actually occurs    self->set_wake_reason( Cyg_Thread::DONE );    Cyg_Thread::counted_sleep();    if ( Cyg_Thread::DONE != self->get_wake_reason() )        CYG_UITRON_FAIL_RETURN_SELF( self );    return E_OK;}#ifdef CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERtslp_tsk ( TMO tmout ){    Cyg_Thread *self = Cyg_Thread::self();    CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self );    CYG_UIT_PARAMCHECK( -1 <= tmout, E_PAR );    CYG_UITRON_CHECK_DISPATCH_ENABLED();    // do this now for the case when no sleeping actually occurs    self->set_wake_reason( Cyg_Thread::DONE );    // note that TMO_POL is not treated specially, though it    // happens to work almost as a poll (some sleeping may occur)    if ( TMO_FEVR == tmout )        Cyg_Thread::counted_sleep();    else        Cyg_Thread::counted_sleep( (cyg_tick_count)tmout );    if ( Cyg_Thread::DONE != self->get_wake_reason() )        CYG_UITRON_FAIL_RETURN_SELF( self );    return E_OK;}#endif // CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERwup_tsk ( ID tskid ){    Cyg_Thread *p;    ER ret = E_OK;    CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );    Cyg_Scheduler::lock();              // get an atomic view of the task    if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||         (Cyg_Thread::EXIT == p->get_wake_reason()) )        ret = E_OBJ;                    // task is dormant    else        p->counted_wake();    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERcan_wup ( INT *p_wupcnt, ID tskid ){    Cyg_Thread *p;    ER ret = E_OK;    if ( 0 == tskid ) {        p = Cyg_Thread::self();        CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );    }    else        CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );    CYG_UIT_PARAMCHECK_PTR( p_wupcnt );    Cyg_Scheduler::lock();              // get an atomic view of the task    if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||         (Cyg_Thread::EXIT == p->get_wake_reason()) )        ret = E_OBJ;                    // task is dormant    else {        cyg_uint32 result = p->cancel_counted_wake();        *p_wupcnt = result;    }    Cyg_Scheduler::unlock();    return ret;}        // - Synchronization and Communication Functions        #ifdef CYGPKG_UITRON_SEMAS#if 0 < CYG_UITRON_NUM( SEMAS )#ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETECYG_UITRON_NEWFUNCTION( Cyg_Counting_Semaphore2 )CYG_UIT_FUNC_INLINEERcre_sem ( ID semid, T_CSEM *pk_csem ){    ER ret = E_OK;    CYG_UIT_PARAMCHECK_PTR( pk_csem );    CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( SEMAS, semid );    if ( TA_TFIFO != pk_csem->sematr )        ret = E_RSATR;    else        CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] =            new( &(CYG_UITRON_OBJS( SEMAS )[ semid - 1 ]) )            Cyg_Counting_Semaphore2( (cyg_count32)pk_csem->isemcnt );    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERdel_sem ( ID semid ){    Cyg_Counting_Semaphore2 *p;    CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );    Cyg_Scheduler::lock();    // deal with the race condition here    if ( p != CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] ) {        Cyg_Scheduler::unlock();        return E_NOEXS;    }    CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] = NULL;    p->~Cyg_Counting_Semaphore2();    Cyg_Scheduler::unlock();    return E_OK;}#endif // CYGPKG_UITRON_SEMAS_CREATE_DELETECYG_UIT_FUNC_INLINEERsig_sem( ID semid ){    Cyg_Counting_Semaphore2 *p;    CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );    p->post();    return E_OK;}CYG_UIT_FUNC_INLINEERwai_sem( ID semid ){    Cyg_Counting_Semaphore2 *p;    CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );    CYG_UITRON_CHECK_DISPATCH_ENABLED();    cyg_bool result = p->wait();    if ( !result )        CYG_UITRON_FAIL_RETURN();    return E_OK;}CYG_UIT_FUNC_INLINEERpreq_sem ( ID semid ){    Cyg_Counting_Semaphore2 *p;    CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );    cyg_bool result = p->trywait();    if ( !result )        return E_TMOUT;    return E_OK;}#ifdef CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERtwai_sem ( ID semid, TMO tmout ){    Cyg_Counting_Semaphore2 *p;    CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );    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 );    cyg_bool result;    if ( TMO_FEVR == tmout )        result = p->wait();    else if ( TMO_POL == tmout )        result = p->trywait();    else        result = p->wait(            Cyg_Clock::real_time_clock->current_value() +            (cyg_tick_count)tmout );    if ( ! result )        CYG_UITRON_FAIL_RETURN_SELF( self );    return E_OK;}#endif // CYGFUN_KERNEL_THREADS_TIMERCYG_UIT_FUNC_INLINEERref_sem ( T_RSEM *pk_rsem, ID semid ){    Cyg_Counting_Semaphore2 *p;    CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );    CYG_UIT_PARAMCHECK_PTR( pk_rsem );    pk_rsem->exinf  = NADR;    pk_rsem->wtsk   = p->waiting();    pk_rsem->semcnt = p->peek();    return E_OK;}#endif // 0 < CYG_UITRON_NUM( SEMAS )#endif // CYGPKG_UITRON_SEMAS#ifdef CYGPKG_UITRON_FLAGS#if 0 < CYG_UITRON_NUM( FLAGS )#ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETECYG_UITRON_NEWFUNCTION( Cyg_Flag )CYG_UIT_FUNC_INLINEERcre_flg ( ID flgid, T_CFLG *pk_cflg ){    ER ret = E_OK;    CYG_UIT_PARAMCHECK_PTR( pk_cflg );    CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( FLAGS, flgid );    if ( 0 != ((~(TA_WMUL | TA_WSGL)) & pk_cflg->flgatr) )        ret = E_RSATR;    else        CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] =            new( &(CYG_UITRON_OBJS( FLAGS )[ flgid - 1 ]) )            Cyg_Flag( (Cyg_FlagValue) pk_cflg->iflgptn );    Cyg_Scheduler::unlock();    return ret;}CYG_UIT_FUNC_INLINEERdel_flg ( ID flgid )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -