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