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

📄 task_manage.c

📁 日本著名的的嵌入式实时操作系统T-Kernel的源码及用户手册。
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif	/* Change priority */	change_task_priority(tcb, priority);	ercd = E_OK;    error_exit:	END_CRITICAL_SECTION;	return ercd;}/* * Rotate ready queue */SYSCALL ER _tk_rot_rdq( PRI tskpri ){	CHECK_PRI_RUN(tskpri);	BEGIN_CRITICAL_SECTION;	if ( tskpri == TPRI_RUN ) {		if ( in_indp() ) {			rotate_ready_queue_run();		} else {			rotate_ready_queue(ctxtsk->priority);		}	} else {		rotate_ready_queue(int_priority(tskpri));	}	END_CRITICAL_SECTION;	return E_OK;}/* * Change slice time */SYSCALL ER _tk_chg_slt( ID tskid, RELTIM slicetime ){	TCB	*tcb;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	BEGIN_CRITICAL_SECTION;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		tcb->slicetime = slicetime;	}	END_CRITICAL_SECTION;	return ercd;}/* ------------------------------------------------------------------------ *//* * Refer task ID at execution */SYSCALL ID _tk_get_tid( void ){	return ( ctxtsk == NULL )? 0: ctxtsk->tskid;}/* * Refer task state */SYSCALL ER _tk_ref_tsk( ID tskid, T_RTSK *pk_rtsk ){	TCB	*tcb;	TSTAT	state;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	bzero(pk_rtsk, sizeof(*pk_rtsk));	BEGIN_CRITICAL_SECTION;	state = tcb->state;	if ( state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		if ( tcb == ctxtsk ) {			pk_rtsk->tskstat = TTS_RUN;		} else {			pk_rtsk->tskstat = (UINT)state << 1;		}		if ( (state & TS_WAIT) != 0 ) {			pk_rtsk->tskwait = tcb->wspec->tskwait;			pk_rtsk->wid     = tcb->wid;			if ( tcb->nodiswai ) {				pk_rtsk->tskstat |= TTS_NODISWAI;			}		}		pk_rtsk->exinf     = tcb->exinf;		pk_rtsk->tskpri    = ext_tskpri(tcb->priority);		pk_rtsk->tskbpri   = ext_tskpri(tcb->bpriority);		pk_rtsk->wupcnt    = tcb->wupcnt;		pk_rtsk->suscnt    = tcb->suscnt;		pk_rtsk->slicetime = tcb->slicetime;		pk_rtsk->waitmask  = tcb->waitmask;		pk_rtsk->texmask   = tcb->texmask;		pk_rtsk->tskevent  = tcb->tskevt;	}	END_CRITICAL_SECTION;	return ercd;}/* * Get task statistic information */SYSCALL ER _tk_inf_tsk( ID tskid, T_ITSK *pk_itsk, BOOL clr ){	TCB	*tcb;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	BEGIN_CRITICAL_SECTION;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		pk_itsk->stime = tcb->stime;		pk_itsk->utime = tcb->utime;		if ( clr ) {			tcb->stime = 0;			tcb->utime = 0;		}	}	END_CRITICAL_SECTION;	return ercd;}/* ------------------------------------------------------------------------ *//* * Get task resource group  */SYSCALL ID _tk_get_rid( ID tskid ){	TCB	*tcb;	ER	ercd;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	BEGIN_CRITICAL_SECTION;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		ercd = tcb->resid;	}	END_CRITICAL_SECTION;	return ercd;}/* * Set task resource group */SYSCALL ID _tk_set_rid( ID tskid, ID resid ){	TCB	*tcb;	ER	ercd;	CHECK_TSKID_SELF(tskid);	CHECK_RESID(resid);	tcb = get_tcb_self(tskid);	BEGIN_CRITICAL_SECTION;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		ercd = tcb->resid;		tcb->resid = resid;	}	END_CRITICAL_SECTION;	return ercd;}/* ------------------------------------------------------------------------ *//* * Release wait */SYSCALL ER _tk_rel_wai( ID tskid ){	TCB	*tcb;	TSTAT	state;	ER	ercd = E_OK;	CHECK_TSKID(tskid);	tcb = get_tcb(tskid);	BEGIN_CRITICAL_SECTION;	state = tcb->state;	if ( (state & TS_WAIT) == 0 ) {		ercd = ( state == TS_NONEXIST )? E_NOEXS: E_OBJ;	} else {		wait_release_ng(tcb, E_RLWAI);	}	END_CRITICAL_SECTION;	return ercd;}/* * Disable task wait */#define	WAIT_PATTERN	( TTW_SLP  | TTW_DLY  | TTW_SEM | TTW_FLG  \			| TTW_SDTQ | TTW_RDTQ | TTW_MBX | TTW_MTX  \			| TTW_SMBF | TTW_RMBF | TTW_CAL | TTW_ACP  \			| TTW_RDV  | TTW_MPF  | TTW_MPL            \			| TTW_EV1  | TTW_EV2  | TTW_EV3 | TTW_EV4  \			| TTW_EV5  | TTW_EV6  | TTW_EV7 | TTW_EV8  \			| TTX_SVC )SYSCALL INT _tk_dis_wai( ID tskid, UINT waitmask ){	TCB	*tcb;	UINT	tskwait;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	CHECK_PAR((waitmask & ~WAIT_PATTERN) == 0);	tcb = get_tcb_self(tskid);	BEGIN_CRITICAL_SECTION;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;		goto error_exit;	}	/* Update wait disable mask */	tcb->waitmask = waitmask;	if ( (tcb->state & TS_WAIT) != 0 ) {		tskwait = tcb->wspec->tskwait;		if ( (tskwait & waitmask) != 0 && !tcb->nodiswai ) {			/* Free wait */			wait_release_ng(tcb, E_DISWAI);			tskwait = 0;		}	} else {		tskwait = 0;	}    error_exit:	END_CRITICAL_SECTION;	return ( ercd < E_OK )? ercd: tskwait;}/* * Enable task wait */SYSCALL ER _tk_ena_wai( ID tskid ){	TCB	*tcb;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	BEGIN_CRITICAL_SECTION;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		tcb->waitmask = 0;	}	END_CRITICAL_SECTION;	return ercd;}/* ------------------------------------------------------------------------ *//* *	Debug support function */#if USE_DBGSPT/* * Get object name from control block */#if USE_OBJECT_NAMEEXPORT ER task_getname(ID id, UB **name){	TCB	*tcb;	ER	ercd = E_OK;	CHECK_TSKID_SELF(id);	BEGIN_DISABLE_INTERRUPT;	tcb = get_tcb_self(id);	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;		goto error_exit;	}	if ( (tcb->tskatr & TA_DSNAME) == 0 ) {		ercd = E_OBJ;		goto error_exit;	}	*name = tcb->name;    error_exit:	END_DISABLE_INTERRUPT;	return ercd;}#endif /* USE_OBJECT_NAME *//* * Refer task usage state */SYSCALL INT _td_lst_tsk( ID list[], INT nent ){	TCB	*tcb, *end;	INT	n = 0;	BEGIN_DISABLE_INTERRUPT;	end = tcb_table + NUM_TSKID;	for ( tcb = tcb_table; tcb < end; tcb++ ) {		if ( tcb->state == TS_NONEXIST ) continue;		if ( n++ < nent ) {			*list++ = tcb->tskid;		}	}	END_DISABLE_INTERRUPT;	return n;}/* * Refer task state */SYSCALL ER _td_ref_tsk( ID tskid, TD_RTSK *pk_rtsk ){	TCB	*tcb;	TSTAT	state;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	bzero(pk_rtsk, sizeof(*pk_rtsk));	BEGIN_DISABLE_INTERRUPT;	state = tcb->state;	if ( state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		if ( tcb == ctxtsk ) {			pk_rtsk->tskstat = TTS_RUN;		} else {			pk_rtsk->tskstat = (UINT)state << 1;		}		if ( (state & TS_WAIT) != 0 ) {			pk_rtsk->tskwait = tcb->wspec->tskwait;			pk_rtsk->wid     = tcb->wid;			if ( ctxtsk->nodiswai ) {				pk_rtsk->tskstat |= TTS_NODISWAI;			}		}		pk_rtsk->exinf     = tcb->exinf;		pk_rtsk->tskpri    = ext_tskpri(tcb->priority);		pk_rtsk->tskbpri   = ext_tskpri(tcb->bpriority);		pk_rtsk->wupcnt    = tcb->wupcnt;		pk_rtsk->suscnt    = tcb->suscnt;		pk_rtsk->slicetime = tcb->slicetime;		pk_rtsk->waitmask  = tcb->waitmask;		pk_rtsk->texmask   = tcb->texmask;		pk_rtsk->tskevent  = tcb->tskevt;		pk_rtsk->task      = tcb->task;		pk_rtsk->stksz     = tcb->stksz;		pk_rtsk->sstksz    = tcb->sstksz - RESERVE_SSTACK(tcb->tskatr);		pk_rtsk->istack    = tcb->istack;		pk_rtsk->isstack   = tcb->isstack;	}	END_DISABLE_INTERRUPT;	return ercd;}/* * Get task statistic information */SYSCALL ER _td_inf_tsk( ID tskid, TD_ITSK *pk_itsk, BOOL clr ){	TCB	*tcb;	ER	ercd = E_OK;	CHECK_TSKID_SELF(tskid);	tcb = get_tcb_self(tskid);	BEGIN_DISABLE_INTERRUPT;	if ( tcb->state == TS_NONEXIST ) {		ercd = E_NOEXS;	} else {		pk_itsk->stime = tcb->stime;		pk_itsk->utime = tcb->utime;		if ( clr ) {			tcb->stime = 0;			tcb->utime = 0;		}	}	END_DISABLE_INTERRUPT;	return ercd;}#endif /* USE_DBGSPT */

⌨️ 快捷键说明

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