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

📄 os_core.p

📁 ucOS 模拟环境
💻 P
📖 第 1 页 / 共 2 页
字号:



 

#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 + -