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

📄 os_core.cpp

📁 易能嵌入式操作系统E_LAND1.0.0_LPC2106_DS12.rar
💻 CPP
字号:
//==========================================================================================
//--文件名:OS_CORE.cpp
//--
//--功  能:完成系统内核的功能
//--
//--作  者:陈  斌
//--
//--版本号:v1.00
//--
//--时  间:2006.12.31
//==========================================================================================
#ifndef OS_CORE_CPP
#define OS_CORE_CPP
#include <E_LAND.H>
OS_PID OSInde(OS_PRITAB* pPri)
{
	OS_PID a;
	OS_PID b;
	if(pPri->PriTA == 0)
	{
		return DOS_PMAX;
	}
	a = OSPINDEX[pPri->PriTA];
	b = pPri->PriTB[a];
	b = OSPINDEX[b];
	a = (a<<3)+b;
	return a;
}
static void OSInitAllPri()
{
	OS_PID i;
	OS_PCB* pPcb = OSPri;
	for(i=0; i<DOS_PMAX; i++)
	{
		*pPcb = i;
		pPcb++;
	}
}
#if DOS_EVENT == EN
static void OSInitAllEcb()
{
	OS_EID i = 0;
	OS_ECB* pEcb = OSEcb;
	pOSEcbFree = 0;
	do
	{
		pEcb->Eid = i;
		*pEcb = 0;
		pEcb++;
		i++;
	}
	while(i < DOS_EMAX);
}
OS_EID CreEven(OS_STATE Stat)
{
	OS_EID tEid = 0;
	OS_ENTER_CRITICAL();
	if(pOSEcbFree != NULL)
	{
		tEid = pOSEcbFree->Eid;
		pOSEcbFree->EStat = Stat;
		if(pOSEcbFree->EidF == pOSEcbFree->Eid)
		{
			pOSEcbFree = NULL;
		}
		else
		{
			OSEcb[pOSEcbFree->EidF].EidN = pOSEcbFree->EidN;
			OSEcb[pOSEcbFree->EidN].EidF = pOSEcbFree->EidF;
			pOSEcbFree = &OSEcb[pOSEcbFree->EidN];
		}
		OS_EXIT_CRITICAL();
		pOSTcbCur->TcbErr = ERR_NONE;
		return tEid;
	}
	else
	{
		OS_EXIT_CRITICAL();
		pOSTcbCur->TcbErr = ERR_EID_NONE;
	}
	return tEid;
}
void OSInit()
{
	OSIdle.Activation();
	#if	(DOS_DEBUG == EN)
	DBGU_INT_LOST = 0;
	#endif
	#if DOS_EVENT == EN
	OSInitAllEcb();
	#endif
	OSInitAllPri();
	OSPriReady = 0;
	OSRunning = 0;
	OSTSWLock = 1;
	pOSDelayCcb = (OS_TCB*)-1;
	OSDelayTick = NULL;
	OSDelayTime = NULL;
	OSInitExt();
}
void OSStrClr(UINT8& str,UINT8& cur)
{
	while(str != cur)
	{
		str = 0;
		str++;
	}
}
void OSSched()
{
	if(CPUintTst() != 0)
	{
		OS_ENTER_CRITICAL();
		OSIndexReady();
		if(pOSHighRdy != pOSTcbCur)
		{
			OSTaskSw();
		}
		OS_EXIT_CRITICAL();
	}
}
void OSTick()
{
	OSTickCou++;
	#if DOS_STAT == EN
	if(OSRunning == 0)
	{
		if(OSTickCou == DOS_SECTICK)
		{
			OSIdleSecCou = NULL;
		}
	}
	else
	#endif
	{
		if(pOSTcbCur->Tick != NULL)
		{
			if((--(pOSTcbCur->Tick)) == NULL)
			{
				pOSTcbCur->Tick = pOSTcbCur->Usuf;
				pOSTcbCur->pPcb->Recur();
			}
		}
		if(OSDelayTime != NULL)
		{
			if((--OSDelayTick) == NULL)
			{
				OSDelayTick = OSDelayTime;
				OSDelayTime = NULL;
				pOSTickCourse->Wake();
			}
		}
	}
	EnIntnesting();
}
void OSStart()
{
	STACK TickStack[DOS_TICKSTA];
	#if DOS_STAT == EN
	STACK Startstack[DOS_STATSTA];
	OS_TCB StatCour(OSStatCourse,(void *)0,Startstack,(sizeof(Startstack))/sizeof(STACK),1,DMC_SYS_MODE);
	#endif
	OS_TCB Tickcour(OSTickDelayCourse,(void*)0,TickStack,(sizeof(TickStack))/sizeof(STACK),0,DMC_SYS_MODE);
	pOSTickCourse = &Tickcour;
	#if DOS_STAT == EN
	OS_IDLE::IdleMain(0);
	OSIdleSecCou = OSSeccou;
	#else
	OSTimeInit();
	#endif
	OSDisIrq();
	BSP_Init();
	OSTickCou = 0;
	OSRunning = 1;
	OSTSWLock = 0;
	OSIndexReady();
	OSStartHighCcb();
}
extern "C"
{
void OSIndexReady(void)
{
	if(OSTSWLock == 0)
	{
		OS_PID pid;
		pid = OSInde(&OSPriReady);
		if(pid != DOS_PMAX)
		{
			pOSHighRdy = pOSTcbRun[pid];
		}
		else
		{
			pOSHighRdy = &OSIdle;
		}
	}
}
void OSIntOverRing()
{
	#if DOS_DEBUG == EN
	DBGU_INT_LOST++;
	#endif
}
void OSCourseSwRing()
{
	#if DOS_STACHE == EN
	SINT16 i;
	i = pOSTcbCur->pContext-pOSTcbCur->pTop;
	ASSERT((i >= 0),1,1,1,ERR_STACK_OVE);
	if(i < pOSTcbCur->StackFree)
	{
		pOSTcbCur->StackFree = i;
	}
	#endif
	pOSTcbCur = (OS_TCB*)pOSHighRdy;
	OSCcbChange++;
	#if DOS_SWHOOK == EN
	OSTaskSwHook();
	#endif
}
}
#endif
#endif

⌨️ 快捷键说明

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