📄 mailbox.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 + -