📄 uit_func.inl
字号:
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 + -