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

📄 queue.cpp

📁 易能嵌入式操作系统E_LAND1.0.0_LPC2106_DS12.rar
💻 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 + -