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

📄 semaphor.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
字号:
/* ------------------------------------------------------------------------- */
/*  HOS 僙儅僼僅娗棟                                                         */
/*                                                                           */
/*                                   Copyright (C) 1998-2002 by Project HOS  */
/* ------------------------------------------------------------------------- */

#include "itron.h"


/* 僙儅僼僅偺弶婜壔 */
void __ini_sem(void)
{
	int i;
	
	for ( i = 0; i < scbcnt; i++ ) {
		scbtbl[i].semcnt = scbstbl[i].isemcnt;
		scbtbl[i].que.tskcnt = 0;
	}
}


/* 僙儅僼僅曉媝 */
ER   sig_sem(ID semid)
{
	T_SCB  *scb;
	T_SCBS *scbs;
	T_TCB  *tcb;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( semid <= 0 )
		return E_ID;
	if ( semid > scbcnt || scbstbl[semid - 1].maxsem == 0 )
		return E_NOEXS;
#endif
	
	scb  = &scbtbl[semid - 1];
	scbs = &scbstbl[semid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 1
	/* 僆乕僶乕僼儘乕僠僃僢僋 */
	if ( scb->semcnt >= scbs->maxsem ) {
		__res_imsk();
		return E_QOVR;
	}
#endif
	
	if ( scb->que.tskcnt == 0 ) {
		scb->semcnt++;
	}
	else {
		/* 僉儏乕愭摢偺懸偪夝彍 */
		tcb = scb->que.head;
		__wup_dsp(tcb, E_OK);
	}
	
	__res_imsk();
	
	return E_OK;
}


/* 僙儅僼僅傪懸偮 */
ER   wai_sem(ID semid)
{
	T_SCB  *scb;
	ER     ercd;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( semid <= 0 )
		return E_ID;
	if ( semid > scbcnt || scbstbl[semid - 1].maxsem == 0 )
		return E_NOEXS;
#endif
	
#if __ERR_CHECK_LEVEL >= 3
	if ( sysstat != TSS_TSK )
		return E_CTX;
#endif
	
	scb  = &scbtbl[semid - 1];
	
	__set_imsk();
	
	if ( scb->semcnt > 0 ) {
		scb->semcnt--;
		__res_imsk();
		return E_OK;
	}
	
	/* 懸偪忬懺偵偡傞 */
	curtcb->tskstat = TTS_WAI;
	curtcb->tskwait = TTW_SEM;
	__del_que(curtcb);
	/* 僙儅僼僅偺懸偪峴楍偵捛壛 */
	__adt_que(&scb->que, curtcb);
	
	/* 僨傿僗僷僢僠 */
	ercd = __tsk_dsp();
	
	__res_imsk();
	
	return ercd;
}


/* 僙儅僼僅傪懸偮(億乕儕儞僌) */
ER   preq_sem(ID semid)
{
	T_SCB  *scb;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( semid <= 0 )
		return E_ID;
	if ( semid > scbcnt || scbstbl[semid - 1].maxsem == 0 )
		return E_NOEXS;
#endif
	
	scb  = &scbtbl[semid - 1];
	
	__set_imsk();
	
	if ( scb->semcnt > 0 ) {
		scb->semcnt--;
		__res_imsk();
		return E_OK;
	}
	
	__res_imsk();
	
	return E_TMOUT;
}


/* 僙儅僼僅忬懺嶲徠 */
ER   ref_sem(T_RSEM *pk_rsem, ID semid)
{
	T_SCB  *scb;
	T_SCBS *scbs;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( semid <= 0 )
		return E_ID;
	if ( semid > scbcnt || scbstbl[semid - 1].maxsem == 0 )
		return E_NOEXS;
#endif
	
	scb  = &scbtbl[semid - 1];
	scbs = &scbstbl[semid - 1];
	
	__set_imsk();

	pk_rsem->exinf = scbs->exinf;
	if ( scb->que.tskcnt == 0 )
		pk_rsem->wtsk = 0;
	else
		pk_rsem->wtsk = (BOOL_ID)(scb->que.head - tcbtbl + 1);
	pk_rsem->semcnt = (INT)scb->semcnt;
	
	__res_imsk();
	
	return E_OK;
}

⌨️ 快捷键说明

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