📄 task.c
字号:
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 + -