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