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

📄 mailbox.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
字号:
/* ------------------------------------------------------------------------- */
/*  HOS 儊僀儖儃僢僋僗娗棟                                                   */
/*                                                                           */
/*                                   Copyright (C) 1998-2002 by Project HOS  */
/* ------------------------------------------------------------------------- */


#include "itron.h"


/* 儊僀儖儃僢僋僗弶婜壔 */
void __ini_mbx(void)
{
	int i;
	
	for ( i = 0; i < mcbcnt; i++ ) {
		mcbtbl[i].que.tskcnt = 0;
		mcbtbl[i].head = mcbstbl[i].bufhead;
		mcbtbl[i].tail = mcbstbl[i].bufhead;
	}
}


/* 儊僀儖儃僢僋僗傊憲怣 */
ER   snd_msg(ID mbxid, VP pk_msg)
{
	T_MCB  *mcb;
	const 	T_MCBS *mcbs;
	T_TCB  *tcb;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( mbxid <= 0 )
		return E_ID;
	if ( mbxid > mcbcnt )
		return E_NOEXS;
#endif
	
	mcb  = &mcbtbl[mbxid - 1];
	mcbs = &mcbstbl[mbxid - 1];
	
	__set_imsk();
	
	if ( mcb->que.tskcnt == 0 ) {
		/* 懸偪僞僗僋偑柍偗傟偽儊僢僙乕僕僉儏乕偵捛壛 */
		mcb->tail++;
		if ( mcb->tail >= mcbs->buftail )
			mcb->tail = mcbs->bufhead;
#if __ERR_CHECK_LEVEL >= 1
		/* 僆乕僶乕僼儘乕僠僃僢僋 */
		if ( mcb->head == mcb->tail ) {
			mcb->tail--;
			return E_QOVR;
		}
#endif
		/* 僶僢僼傽偵僨乕僞傪奿擺 */
		*mcb->tail = pk_msg;
	}
	else {
		/* 懸偪僞僗僋婲彴 */
		tcb = mcb->que.head;
		tcb->data = pk_msg;
		__wup_dsp(tcb, E_OK);
	}
	
	__res_imsk();
	
	return E_OK;
}


/* 儊僀儖儃僢僋僗偐傜庴怣 */
ER   rcv_msg(VP *pk_msg, ID mbxid)
{
	T_MCB *mcb;
	const T_MCBS *mcbs;
	ER ercd;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( mbxid <= 0 )
		return E_ID;
	if ( mbxid > mcbcnt )
		return E_NOEXS;
#endif
#if __ERR_CHECK_LEVEL >= 3
	if ( sysstat != TSS_TSK )
		return E_CTX;
#endif
	
	mcb  = &mcbtbl[mbxid - 1];
	mcbs = &mcbstbl[mbxid - 1];
	
	__set_imsk();
	
	/* 儊僢僙乕僕偑偁傟偽庢傝弌偡 */
	if ( mcb->head != mcb->tail ) {
		mcb->head++;
		if ( mcb->head >= mcbs->buftail )
			mcb->head = mcbs->bufhead;
		*pk_msg = *mcb->head;
		__res_imsk();
		return E_OK;
	}

	/* 懸偪忬懺偵堏峴 */
	curtcb->tskstat = TTS_WAI;
	curtcb->tskwait = TTW_MBX;
	
	/* 懸偪峴楍偵捛壛 */
	__del_que(curtcb);
	__adt_que(&mcb->que, curtcb);
	
	/* 僨傿僗僷僢僠 */
	ercd = __tsk_dsp();
	*pk_msg = curtcb->data;
	
	__res_imsk();
	
	return ercd;
}


/* 儊僀儖儃僢僋僗偐傜庴怣(億乕儕儞僌) */
ER   prcv_msg(VP *pk_msg, ID mbxid)
{
	T_MCB  *mcb;
	T_MCBS *mcbs;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( mbxid <= 0 )
		return E_ID;
	if ( mbxid > mcbcnt )
		return E_NOEXS;
#endif
	
	mcb  = &mcbtbl[mbxid - 1];
	mcbs = &mcbstbl[mbxid - 1];
	
	__set_imsk();
	
	/* 儊僢僙乕僕偺懚嵼僠僃僢僋 */
	if ( mcb->head == mcb->tail ) {
		__res_imsk();
		return E_TMOUT;
	}
	
	/* 儊僢僙乕僕傪庢傝弌偡 */
	mcb->head++;
	if ( mcb->head >= mcbs->buftail )
		mcb->head = mcbs->bufhead;
	*pk_msg   = *mcb->head;
	
	__res_imsk();
	
	return E_OK;
}


/* 儊僀儖儃僢僋僗忬懺嶲徠 */
ER   ref_mbx(T_RMBX *pk_rmbx, ID mbxid)
{
	T_MCB  *mcb;
	T_MCBS *mcbs;
	
#if __ERR_CHECK_LEVEL >= 4
	if ( mbxid <= 0 )
		return E_ID;
	if ( mbxid > mcbcnt )
		return E_NOEXS;
#endif
	
	mcb  = &mcbtbl[mbxid - 1];
	mcbs = &mcbstbl[mbxid - 1];
	
	__set_imsk();
	
	pk_rmbx->exinf = mcbs->exinf;
	if ( mcb->que.tskcnt > 0 )
		pk_rmbx->wtsk = tcbtbl - mcb->que.head + 1;
	else
		pk_rmbx->wtsk = 0;
	pk_rmbx->pk_msg = *mcb->head;
	
	__res_imsk();
	
	return E_OK;
}

⌨️ 快捷键说明

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