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

📄 task.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
📖 第 1 页 / 共 2 页
字号:
	if ( tskid <= 0 )
		return E_ID;
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
#endif
	
	tcb = &tcbtbl[tskid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 2
	/* 僞僗僋忬懺僠僃僢僋 */
	if ( !(tcb->tskstat & TTS_WAI) || tcb->tskwait == TTW_SPL ) {
		__res_imsk();
		return E_OBJ;
	}
#endif
	
	/* 懸偪夝彍 */
	__wup_dsp(tcb, E_RLWAI);
	
	__res_imsk();
	
	return E_OK;
}


/* 帺僞僗僋偺ID嶲徠 */
ER   get_tid(ID *p_tskid)
{
#if __ERR_CHECK_LEVEL >= 4
	if ( (sysstat & TSS_INDP) || curtcb == NADR ) {
		*p_tskid = FALSE;
		return E_OK;
	}
#endif
	
	*p_tskid = (curtcb - tcbtbl) + 1;
	
	return E_OK;
}


/* 僞僗僋忬懺嶲徠 */
ER   ref_tsk(T_RTSK *pk_rtsk, ID tskid)
{
	T_TCB  *tcb;
	const T_TCBS *tcbs;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
	if ( tskid == TSK_SELF && ((sysstat & TSS_INDP) || curtcb == NADR) )
		return E_ID;
#endif
	
	if ( tskid == TSK_SELF )
		tskid = (curtcb - tcbtbl) + 1;
	
	tcb  = &tcbtbl[tskid - 1];
	tcbs = &tcbstbl[tskid - 1];
	
	__set_imsk();
	
	pk_rtsk->exinf   = tcbs->exinf;
	pk_rtsk->tskpri  = tcb->tskpri;
	pk_rtsk->tskstat = tcb->tskstat;
	
	__res_imsk();
	
	return E_OK;
}




/* 懠僞僗僋傪嫮惂懸偪忬懺傊堏峴 */
ER   sus_tsk(ID tskid)
{
	T_TCB *tcb;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( tskid <= 0 )
		return E_ID;
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
#endif
	
	tcb = &tcbtbl[tskid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 2
	if ( (!(sysstat & TSS_INDP) && tcb == curtcb)
			|| tcb->tskstat == TTS_DMT ) {
		__res_imsk();
		return E_OBJ;
	}
#endif
	
	/* 婛偵 SUSPEND側傜僱僗僩 */
	if ( tcb->tskstat & TTS_SUS ) {
#if __ERR_CHECK_LEVEL >= 1
		/* 僱僗僩偺僆乕僶乕僼儘乕僠僃僢僋 */
		if ( tcb->suscnt >= MAX_SUSCNT ) {
			__res_imsk();
			return E_QOVR;
		}
#endif
		tcb->suscnt++;
	}
	else {
		/* SUSPEND偝偣傞 */
		if ( tcb->tskstat == TTS_WAI )
			tcb->tskstat = TTS_WAS;
		else
			tcb->tskstat = TTS_SUS;
		
		/* 僞僗僋撈棫晹偱幚峴拞偺僞僗僋傪巜掕偟偨応崌 */
		if ( tcb == curtcb )
			dlydsp = TRUE;	/* 抶墑僨傿僗僷僢僠愝掕 */
	}
	
	__res_imsk();
	
	return E_OK;
}


/* 嫮惂懸偪忬懺偺僞僗僋傪嵞奐 */
ER   rsm_tsk(ID tskid)
{
	T_TCB *tcb;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( tskid <= 0 )
		return E_ID;
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
#endif
	
	tcb = &tcbtbl[tskid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 2
	/* 僄儔乕僠僃僢僋 */
	if ( tcb == curtcb || !(tcb->tskstat & TTS_SUS) ) {
		__res_imsk();
		return E_OBJ;
	}
#endif
	
	if ( tcb->suscnt != 0 ) {
		/* 僱僗僩僨僋儕儊儞僩 */
		tcb->suscnt--;
	}
	else {
		/* SUSPEND 夝彍 */
		tcb->tskstat &= ~TTS_SUS;
		if ( tcb->tskstat != TTS_WAI ) {
			tcb->tskstat = TTS_RDY;
			
			/* 僨傿僗僷僢僠 */
			__tsk_dsp();
		}
	}
	
	__res_imsk();
	
	return E_OK;
}


/* 嫮惂懸偪忬懺偺僞僗僋傪嫮惂嵞奐 */
ER frsm_tsk(ID tskid)
{
	T_TCB *tcb;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( tskid <= 0 )
		return E_ID;
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
#endif
	
	tcb = &tcbtbl[tskid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 2
	/* 僄儔乕僠僃僢僋 */
	if ( tcb == curtcb || !(tcb->tskstat & TTS_SUS) ) {
		__res_imsk();
		return E_OBJ;
	}
#endif
	
	/* 嫮惂夝彍 */
	tcb->suscnt = 0;
	return rsm_tsk(tskid);
}


/* 帺僞僗僋傪婲彴懸偪忬懺傊堏峴 */
ER   slp_tsk(void)
{
	ER ercd;
	
#if __ERR_CHECK_LEVEL >= 3
	/* 僄儔乕僠僃僢僋 */
	if( sysstat != 0 )
		return E_CTX;
#endif
	
	__set_imsk();
	
	/* 婲彴梫媮偺僉儏乕僀儞僌偑偁傞偐 */
	if ( curtcb->wupcnt > 0 ) {
		curtcb->wupcnt--;
		__res_imsk();
		return E_OK;
	}
	
	/* 懸偪忬懺偵堏峴 */
	__del_que(curtcb);
	curtcb->tskstat = TTS_WAI;
	curtcb->tskwait = TTW_SLP;
	
	/* 僨傿僗僷僢僠 */
	ercd = __tsk_dsp();
	
	__res_imsk();
	
	return ercd;
}


/* 懠僞僗僋偺婲彴 */
ER   wup_tsk(ID tskid)
{
	T_TCB *tcb;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID 僠僃僢僋 */
	if ( tskid <= 0 )
		return E_ID;
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
#endif
	
	tcb = &tcbtbl[tskid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 2
	/* 忬懺僠僃僢僋 */
	if ( tcb == curtcb || tcb->tskstat == TTS_DMT ) {
		__res_imsk();
		return E_OBJ;
	}
#endif
	
	/* 懸偪忬懺偱側偗傟偽僉儏乕僀儞僌 */
	if ( !(tcb->tskstat & TTS_WAI) || tcb->tskwait != TTW_SLP ) {
#if __ERR_CHECK_LEVEL >= 1
		if ( tcb->wupcnt == MAX_WUPCNT ) {
			__res_imsk();
			return E_QOVR;
		}
#endif
		tcb->wupcnt++;
	}
	else {
		/* 懸偪夝彍 */
		tcb->tskstat &= ~TTS_WAI;
		tcb->tskwait  = 0;
		*(tcb->sp)    = E_OK;
		if ( tcb->tskstat != TTS_SUS ) {
			/* 儗僨傿乕僉儏乕偵愙懕 */
			tcb->tskstat = TTS_RDY;
			__adt_que(&rdyque[tcb->tskpri - 1], tcb);
			
			/* 僨傿僗僷僢僠 */
			__tsk_dsp();
		}
	}
	
	__res_imsk();
	
	return E_OK;
}


/* 僞僗僋婲彴梫媮傪柍岠壔 */
ER   can_wup(ID tskid)
{
	T_TCB *tcb;
	INT   wupcnt;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( tskid > tcbcnt || tcbtbl[tskid - 1].tskstat == 0 )
		return E_NOEXS;
	if ( tskid == TSK_SELF && (sysstat & TSS_INDP) )
		return E_ID;
#endif
	
	if ( tskid == TSK_SELF )
		tcb = curtcb;
	else
		tcb = &tcbtbl[tskid - 1];
	
	__set_imsk();
	
	wupcnt = tcb->wupcnt;
	tcb->wupcnt = 0;
	
	__res_imsk();
	
	return wupcnt;
}



/* 僞僗僋偺僨傿僗僷僢僠(妱崬傒嬛巭偼屇傃弌偟懁偱昁梫) */
ER  __tsk_dsp(void)
{
	T_TCB *tcb;
	int   i, j;
	
	/* 僨傿僗僷僢僠壜擻偐 */
	if ( sysstat != TSS_TSK ) {
		dlydsp = TRUE;
		return 0;
	}
	
	/* 僨傿僗僷僢僠幚峴 */
	dlydsp = FALSE;
	
	/* 巜掕桪愭搙偺師偺僞僗僋傪扵偡 */
	for ( i = 0; i < rdqcnt; i++ ) {
		if ( rdyque[i].tskcnt > 0 ) {
			tcb = rdyque[i].head;
			/* 僒僗儁儞僪偱柍偄愭摢僞僗僋傪扵偡 */
			for ( j = 0; j < rdyque[i].tskcnt; j++ ) {
				if ( !(tcb->tskstat & TTS_SUS) )
					break;
				tcb = tcb->next;
			}
			if ( j >= rdyque[i].tskcnt )
				continue;
			
			/* 嵟弶偵尒偮偗偨僞僗僋傪 RUN偵偡傞 */
			tcb->tskstat = TTS_RUN;
			if ( curtcb == NADR || curtcb->tskstat == TTS_DMT ) {
				curtcb = tcb;
				__sta_dsp(tcb);		/* 僞僗僋奐巒 */
			}
			else {
				if ( tcb == curtcb )
					return 0;
				if ( curtcb->tskstat == TTS_RUN )
					curtcb->tskstat = TTS_RDY;
				return __swc_dsp(tcb);		/* 僞僗僋愗傝懼偊 */
			}
		}
	}
	
	/* 師偵幚峴偡傞僞僗僋偑柍偄 */
	if ( curtcb != NADR && curtcb->tskstat != TTS_DMT )
		return __end_dsp();
	
	/* 幚峴僞僗僋側偟 */
	__tsk_hlt();
}


/* 懸偪忬懺夝彍 */
void __wup_dsp(T_TCB *tcb, ER ercd)
{
	/* 懸偪忬懺夝彍 */
	tcb->tskwait  = 0;
	*(tcb->sp)    = (UH)ercd;
	if ( tcb->que != NADR )
		__del_que(tcb);
	
	/* 儗僨傿乕僉儏乕傊愙懕 */
	__adt_que(&rdyque[tcb->tskpri - 1], tcb);
	
	/* 忬懺暅婣 */
	if ( tcb->tskstat == TTS_WAS ) {
		tcb->tskstat = TTS_SUS;
	}
	else {
		tcb->tskstat = TTS_RDY;
		__tsk_dsp();
	}
}

⌨️ 快捷键说明

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