📄 os_core.p
字号:
#line 1166 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\ucos_ii.h"
#line 1258 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\ucos_ii.h"
#line 18 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
INT8U const OSMapTbl[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
INT8U const OSUnMapTbl[256] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
static void OS_InitMisc(void);
static void OS_InitRdyList(void);
static void OS_InitTaskIdle(void);
static void OS_InitTaskStat(void);
static void OS_InitTCBList(void);
void OSInit (void)
{
INT16U i;
OS_EVENT *pevent1;
OS_EVENT *pevent2;
OSInitHookBegin();
OS_InitMisc();
OS_InitRdyList();
OS_InitTCBList();
#line 111 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
pevent1 = &OSEventTbl[0];
pevent2 = &OSEventTbl[1];
for (i = 0; i < (5 - 1); i++) {
pevent1->OSEventType = 0;
pevent1->OSEventPtr = pevent2;
pevent1++;
pevent2++;
}
pevent1->OSEventType = 0;
pevent1->OSEventPtr = (OS_EVENT *)0;
OSEventFreeList = &OSEventTbl[0];
OS_QInit();
OS_InitTaskIdle();
OS_InitTaskStat();
OSInitHookEnd();
}
void OSIntEnter (void)
{
if (OSRunning == 1) {
if (OSIntNesting < 255u) {
OSIntNesting++;
}
}
}
void OSIntExit (void)
{
OS_CPU_SR cpu_sr;
if (OSRunning == 1) {
cpu_sr = OSCPUSaveSR();
if (OSIntNesting > 0) {
OSIntNesting--;
}
if (OSIntNesting == 0) {
if (OSLockNesting == 0) {
OSIntExitY = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
if (OSPrioHighRdy != OSPrioCur) {
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OSIntCtxSw();
}
}
}
OSCPURestoreSR(cpu_sr);
}
}
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == 0) {
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy();
}
}
void OSStatInit (void)
{
OS_CPU_SR cpu_sr;
OSTimeDly(2);
cpu_sr = OSCPUSaveSR();
OSIdleCtr = 0L;
OSCPURestoreSR(cpu_sr);
OSTimeDly(75 / 10);
cpu_sr = OSCPUSaveSR();
OSIdleCtrMax = OSIdleCtr;
OSStatRdy = 1;
OSCPURestoreSR(cpu_sr);
}
void OSTimeTick (void)
{
OS_CPU_SR cpu_sr;
OS_TCB *ptcb;
BOOLEAN step;
OSTimeTickHook();
#line 337 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
if (OSRunning == 1) {
ptcb = OSTCBList;
while (ptcb->OSTCBPrio != (4)) {
cpu_sr = OSCPUSaveSR();
if (ptcb->OSTCBDly != 0) {
if (--ptcb->OSTCBDly == 0) {
if ((ptcb->OSTCBStat & 0x08) == 0x00) {
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
} else {
ptcb->OSTCBDly = 1;
}
}
}
ptcb = ptcb->OSTCBNext;
OSCPURestoreSR(cpu_sr);
}
}
}
static void OS_InitMisc (void)
{
OSTaskCtr = 0;
OSRunning = 0;
OSCtxSwCtr = 0;
OSIdleCtr = 0L;
OSIdleCtrRun = 0L;
OSIdleCtrMax = 0L;
OSStatRdy = 0;
}
static void OS_InitRdyList (void)
{
INT16U i;
INT8U *prdytbl;
OSRdyGrp = 0x00;
prdytbl = &OSRdyTbl[0];
for (i = 0; i < ((4) / 8 + 1); i++) {
*prdytbl++ = 0x00;
}
OSPrioCur = 0;
OSPrioHighRdy = 0;
OSTCBHighRdy = (OS_TCB *)0;
OSTCBCur = (OS_TCB *)0;
}
static void OS_InitTaskIdle (void)
{
#line 481 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[25 - 1],
(4));
#line 492 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
}
static void OS_InitTaskStat (void)
{
#line 534 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
(void)OSTaskCreate(OS_TaskStat,
(void *)0,
&OSTaskStatStk[50 - 1],
(4 - 1));
#line 545 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
}
static void OS_InitTCBList (void)
{
INT8U i;
OS_TCB *ptcb1;
OS_TCB *ptcb2;
OS_MemClr((INT8U *)&OSTCBTbl[0], sizeof(OSTCBTbl));
OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl));
ptcb1 = &OSTCBTbl[0];
ptcb2 = &OSTCBTbl[1];
for (i = 0; i < (2 + 2 - 1); i++) {
ptcb1->OSTCBNext = ptcb2;
ptcb1++;
ptcb2++;
}
ptcb1->OSTCBNext = (OS_TCB *)0;
OSTCBList = (OS_TCB *)0;
OSTCBFreeList = &OSTCBTbl[0];
}
void OS_MemClr (INT8U *pdest, INT16U size)
{
while (size > 0) {
*pdest++ = (INT8U)0;
size--;
}
}
void OS_MemCopy (INT8U *pdest, INT8U *psrc, INT16U size)
{
while (size > 0) {
*pdest++ = *psrc++;
size--;
}
}
INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
{
OS_TCB *ptcb;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
INT8U prio;
y = OSUnMapTbl[pevent->OSEventGrp];
bity = OSMapTbl[y];
x = OSUnMapTbl[pevent->OSEventTbl[y]];
bitx = OSMapTbl[x];
prio = (INT8U)((y << 3) + x);
if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {
pevent->OSEventGrp &= ~bity;
}
ptcb = OSTCBPrioTbl[prio];
ptcb->OSTCBDly = 0;
ptcb->OSTCBEventPtr = (OS_EVENT *)0;
ptcb->OSTCBMsg = msg;
ptcb->OSTCBStat &= ~msk;
if (ptcb->OSTCBStat == 0x00) {
OSRdyGrp |= bity;
OSRdyTbl[y] |= bitx;
}
return (prio);
}
void OS_EventTaskWait (OS_EVENT *pevent)
{
OSTCBCur->OSTCBEventPtr = pevent;
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
}
void OS_EventTO (OS_EVENT *pevent)
{
if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBStat = 0x00;
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
}
void OS_EventWaitListInit (OS_EVENT *pevent)
{
INT8U *ptbl;
pevent->OSEventGrp = 0x00;
ptbl = &pevent->OSEventTbl[0];
*ptbl++ = 0x00;
}
void OS_Sched (void)
{
OS_CPU_SR cpu_sr;
INT8U y;
cpu_sr = OSCPUSaveSR();
if (OSIntNesting == 0) {
if (OSLockNesting == 0) {
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
if (OSPrioHighRdy != OSPrioCur) {
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OSCtxSw();
}
}
}
OSCPURestoreSR(cpu_sr);
}
#line 892 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
#line 923 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
void OS_TaskIdle (void *parg)
{
OS_CPU_SR cpu_sr;
parg = parg;
for (;;) {
cpu_sr = OSCPUSaveSR();
OSIdleCtr++;
OSCPURestoreSR(cpu_sr);
OSTaskIdleHook();
}
}
void OS_TaskStat (void *parg)
{
OS_CPU_SR cpu_sr;
INT32U run;
INT32U max;
INT8S usage;
parg = parg;
while (OSStatRdy == 0) {
OSTimeDly(2 * 75 / 10);
}
max = OSIdleCtrMax / 100L;
for (;;) {
cpu_sr = OSCPUSaveSR();
OSIdleCtrRun = OSIdleCtr;
run = OSIdleCtr;
OSIdleCtr = 0L;
OSCPURestoreSR(cpu_sr);
if (max > 0L) {
usage = (INT8S)(100L - run / max);
if (usage >= 0) {
OSCPUUsage = usage;
} else {
OSCPUUsage = 0;
}
} else {
OSCPUUsage = 0;
max = OSIdleCtrMax / 100L;
}
OSTaskStatHook();
OSTimeDly(75 / 10);
}
}
INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
{
OS_CPU_SR cpu_sr;
OS_TCB *ptcb;
cpu_sr = OSCPUSaveSR();
ptcb = OSTCBFreeList;
if (ptcb != (OS_TCB *)0) {
OSTCBFreeList = ptcb->OSTCBNext;
OSCPURestoreSR(cpu_sr);
ptcb->OSTCBStkPtr = ptos;
ptcb->OSTCBPrio = prio;
ptcb->OSTCBStat = 0x00;
ptcb->OSTCBDly = 0;
#line 1095 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
pext = pext;
stk_size = stk_size;
pbos = pbos;
opt = opt;
id = id;
ptcb->OSTCBY = (INT8U)(prio >> 3);
ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
ptcb->OSTCBX = (INT8U)(prio & 0x07);
ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
ptcb->OSTCBEventPtr = (OS_EVENT *)0;
ptcb->OSTCBMsg = (void *)0;
#line 1130 "E:\\Study\\ucOS-II\\ucOS-II\\ucOS kernel\\Task\\os_core.c"
OSTCBInitHook(ptcb);
OSTaskCreateHook(ptcb);
cpu_sr = OSCPUSaveSR();
OSTCBPrioTbl[prio] = ptcb;
ptcb->OSTCBNext = OSTCBList;
ptcb->OSTCBPrev = (OS_TCB *)0;
if (OSTCBList != (OS_TCB *)0) {
OSTCBList->OSTCBPrev = ptcb;
}
OSTCBList = ptcb;
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OSCPURestoreSR(cpu_sr);
return (0);
}
OSCPURestoreSR(cpu_sr);
return (70u);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -