📄 queue.cpp
字号:
//==========================================================================================
//--文件名:QUEUE.CPP
//--
//--功 能:
//--
//--作 者:陈 斌
//--
//--版本号:v1.00
//--
//--时 间:2006.12.31
//==========================================================================================
#ifndef QUEUE_CPP
#define QUEUE_CPP
#include <E_LAND.H>
#if DOS_QUEUE == EN
OS_EID CreEven(OS_QCB* pQcb,OS_FLAGS Flags,OS_STATE Stat)
{
OS_EID Eid;
ASSERT(Stat>0x0F,1,1,1, ERR_QUE_FUN);
Eid = CreEven(Stat|EVE_QUEUE);
if(pOSTcbCur->TcbErr == ERR_NONE)
{
OSEcb[Eid].pMixed = pQcb;
OSEcb[Eid].Flags = Flags;
pQcb->Qmax = Flags;
pQcb->Eid = Eid;
return Eid;
}
return 0;
}
#endif
#if DOS_QUELOCK == EN
UINT8 OS_ECB::SetLock(OS_ETCB* pEtcb)
{
OS_ETCB** pEcbl;
ASSERT((EStat&0x0F)==EVE_QUEUE,1,1,1,ERR_EVE_QLOCK);
pEcbl = &((OS_QCB*)pMixed)->pUseEtcb;
OS_ENTER_CRITICAL();
if(*pEcbl == (OS_ETCB*)0)
{
*pEcbl = pEtcb;
if((*pEcbl)->pEcb == this)
{
pEtcb->Shift(pEtcb->ppCcb,NULL);
pEtcb->Unready();
pEtcb->ppCcb = &(pOSTcbRun[pEtcb->pPcb->Prio]);
pEtcb->pPritab = &OSPriReady;
}
OS_EXIT_CRITICAL();
return ERR_NONE;
}
OS_EXIT_CRITICAL();
return ERR_EVE_LOCOVE;
}
void OS_ECB::Unlock()
{
OS_ETCB** pEcbl;
ASSERT((EStat&0x0F)==EVE_QUEUE,1,1,1,ERR_EVE_QLOCK);
pEcbl = &((OS_QCB*)pMixed)->pUseEtcb;
if((*pEcbl)->pEcb == this)
{
*pEcbl = (OS_ETCB*)0;
}
}
#endif
void OS_QCB::ResetQueue()
{
OS_ENTER_CRITICAL();
OSEcb[Eid].Flags = Qmax;
pPop = pPush;
#if DOS_QUELOCK == EN
pUseEtcb = 0;
#endif
OS_EXIT_CRITICAL();
}
OS_QCB::OS_QCB(OS_QDCB* pStart,OS_QDCB* pEnd)
{
pTop = pEnd;
pPop = pPush = pBottom = pStart;
#if DOS_QUELOCK == EN
pUseEtcb = 0;
#endif
}
void OS_QCB::PUSH_ADJUST()
{
OS_ECB* pEcb;
pEcb = &OSEcb[Eid];
pEcb->Flags--;
#if DOS_QUELOCK == EN
if(pUseEtcb != 0)
{
if(pUseEtcb->Deep == NULL)
{
if(pUseEtcb->pEcb == pEcb)
{
pUseEtcb->Shift(NULL,pUseEtcb->ppCcb);
pUseEtcb->Ready();
pUseEtcb->pEcb = 0;
OSSched();
}
}
}
else
#endif
{
pEcb->ReadyEccb();
}
}
#if DKE_UINT8Q == EN
#if DOS_QUEFIFO == EN
OS_FLAGS OS_UINT8_QD::PUSH_FIFO(OS_EID Eid)
{
OS_ECB* pEcb = &OSEcb[Eid];
OS_QCB* pQcb = (OS_QCB*)(pEcb->pMixed);
ASSERT(((pEcb->EStat)==(DQUEU_UINT8|EVE_QUEUE)),1,1,1,ERR_PUSH);
OS_ENTER_CRITICAL();
OS_FLAGS i = pEcb->Flags;
if(i != 0)
{
((OS_UINT8_QD*)(pQcb->pPush))->Data = Data;
(OS_UINT8_QD*)(pQcb->pPush)++;
Push_Over();
pQcb->PUSH_ADJUST();
}
OS_EXIT_CRITICAL();
return i;
}
#endif
#if DOS_QUELIFO == EN
OS_FLAGS OS_UINT8_QD::PUSH_LIFO(OS_EID Eid)
{
OS_FLAGS i;
OS_ECB* pEcb = &OSEcb[Eid];
OS_QCB* pQcb = (OS_QCB*)(pEcb->pMixed);
ASSERT(( pEcb->EStat == (DQUEU_UINT8|EVE_QUEUE)),1,1,1,ERR_PUSH);
OS_ENTER_CRITICAL();
i = pEcb->Flags;
if(i != 0)
{
(OS_UINT8_QD*)(pQcb->pPop)--;
Ppop_Out();
((OS_UINT8_QD*)(pQcb->pPop))->Data = Data;
pQcb->PUSH_ADJUST();
}
OS_EXIT_CRITICAL();
return i;
}
#endif
OS_FLAGS OS_QCB::POP_ADJUST(OS_ECB *pEcb, TIMETYPE Time)
{
OS_FLAGS i;
do
{
i = Qmax - pEcb->Flags;
if(i > 0 )
{
#if DOS_QUELOCK == EN
if(pOSTcbCur != pUseEtcb)
{
if(pUseEtcb != 0)
{
pOSTcbCur->TcbErr = ERR_EVE_LOCOVE;
return 0;
}
}
#endif
((OS_ETCB*)pOSTcbCur)->pEcb = 0;
pEcb->Flags++;
return i;
}
else
{
if(CPUintTst() == 0)
{
return 0;
}
((OS_ETCB*)pOSTcbCur)->pEcb = pEcb;
#if DOS_QUELOCK == EN
if(pOSTcbCur == pUseEtcb)
{
pOSTcbCur->Shift(pOSTcbCur->ppCcb, NULL);
pOSTcbCur->Unready();
if(Time != DOS_UNLIMIT)
{
pOSTcbCur->DelayOper(Time);
continue;
}
OSSched();
}
else
#endif
{
((OS_ETCB*)pOSTcbCur)->WaitEve(pEcb, Time);
}
}
}
while(((OS_ETCB*)pOSTcbCur)->TcbErr == DEF_EVE_WAITE);
return 0;
}
OS_FLAGS OS_UINT8_QD::POP(OS_EID Eid,TIMETYPE Time)
{
OS_FLAGS i;
OS_ECB* pEcb = &OSEcb[Eid];
OS_QCB* pQcb;
ASSERT((pEcb->EStat == (DQUEU_UINT8|EVE_QUEUE)),1,1,1,ERR_POP);
ASSERT(CPUintTst() != 0, 1, 1, 1, ERR_EVE_MAPP);
OS_ENTER_CRITICAL();
pQcb = (OS_QCB*)(pEcb->pMixed);
i= pQcb->POP_ADJUST(pEcb, Time);
if(i != 0)
{
Data = ((OS_UINT8_QD*)(pQcb->pPop))->Data;
(OS_UINT8_QD*)(pQcb->pPop)++;
Ppop_Over();
}
OS_EXIT_CRITICAL();
return i;
}
#endif
#if DKE_FUNQ == EN
#if DOS_QUEFIFO == EN
OS_FLAGS OS_FUN_QD::PUSH_FIFO(OS_EID Eid)
{
OS_ECB* pEcb = &OSEcb[Eid];
OS_QCB* pQcb = (OS_QCB*)(pEcb->pMixed);
ASSERT(((pEcb->EStat)==(DQUEU_FUN|EVE_QUEUE)),1,1,1,ERR_PUSH);
OS_ENTER_CRITICAL();
OS_FLAGS i = pEcb->Flags;
if(i != 0)
{
((OS_FUN_QD*)(pQcb->pPush))->Data = Data;
(OS_FUN_QD*)(pQcb->pPush)++;
Push_Over();
pQcb->PUSH_ADJUST();
}
OS_EXIT_CRITICAL();
return i;
}
#endif
#if DOS_QUELIFO == EN
OS_FLAGS OS_FUN_QD::PUSH_LIFO(OS_EID Eid)
{
OS_FLAGS i;
OS_ECB* pEcb = &OSEcb[Eid];
OS_QCB* pQcb = (OS_QCB*)(pEcb->pMixed);
ASSERT(( pEcb->EStat == (DQUEU_FUN|EVE_QUEUE)),1,1,1,ERR_PUSH);
OS_ENTER_CRITICAL();
i = pEcb->Flags;
if(i != 0)
{
(OS_FUN_QD*)(pQcb->pPop)--;
Ppop_Out();
((OS_FUN_QD*)(pQcb->pPop))->Data = Data;
pQcb->PUSH_ADJUST();
}
OS_EXIT_CRITICAL();
return i;
}
#endif
OS_FLAGS OS_FUN_QD::POP(OS_EID Eid,TIMETYPE Time)
{
OS_FLAGS i;
OS_QCB* pQcb;
OS_ECB* pEcb = &OSEcb[Eid];
ASSERT((pEcb->EStat == (DQUEU_FUN|EVE_QUEUE)),1,1,1,ERR_POP);
ASSERT(CPUintTst() != 0, 1, 1, 1, ERR_EVE_MAPP);
OS_ENTER_CRITICAL();
pQcb = (OS_QCB*)(pEcb->pMixed);
i= pQcb->POP_ADJUST(pEcb, Time);
if(i != 0)
{
Data = ((OS_FUN_QD*)(pQcb->pPop))->Data;
(OS_FUN_QD*)(pQcb->pPop)++;
Ppop_Over();
}
OS_EXIT_CRITICAL();
return i;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -