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

📄 task_init.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
字号:
#include "OS_CPU.h"
#include "OS_TCB.h"
#include "global.h"

extern  INT8U    const      OSUnMapTbl[256];
extern  INT8U    const          OSMapTbl[8];
extern void  OSStartHighRdy(void);extern INT8U  CPU_SR_Rd(void); 

 void  OS_InitRdyList (void)
{
    INT8U    i;

    INT8U   *prdytbl;
    OSRdyGrp      = 0;                                     /* Clear the ready list                     */
    prdytbl       = &OSRdyTbl[0];
    for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
        *prdytbl++ = 0;
    }

    OSPrioCur     = 0;
    OSPrioHighRdy = 0;

    OSTCBHighRdy  = (OS_TCB *)0;
    OSTCBCur      = (OS_TCB *)0;
	
}


void  OS_MemClr (INT8U *pdest, INT16U size)
{
    while (size > 0) {
        *pdest++ = (INT8U)0;
        size--;
    }
}

 void  OS_InitTCBList (void)
{
    INT8U    i;
    OS_TCB  *ptcb1;
    OS_TCB  *ptcb2;


    OS_MemClr((INT8U *)&OSTCBTbl[0],     sizeof(OSTCBTbl));      /* Clear all the TCBs                 */
    OS_MemClr((INT8U *)&OSTCBidTbl[0], sizeof(OSTCBidTbl));     /* Clear the id table                  */
    OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl));  /* Clear the priority table           */
    ptcb1 = &OSTCBTbl[0];
    ptcb2 = &OSTCBTbl[1];
    for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs            */
        ptcb1->OSTCBNext = ptcb2;

        ptcb1++;
        ptcb2++;
    }
    ptcb1->OSTCBNext = (OS_TCB *)0;                              /* Last OS_TCB                        */

    OSTCBList               = (OS_TCB *)0;                       /* TCB lists initializations          */
    OSTCBFreeList           = &OSTCBTbl[0];
}


INT8U  OS_TCBInit (OS_STK *ptos,INT8U prio, INT8U id, INT32U stk_size, INT8U taskclass,INT8U  autoact,INT8U  schedpcy)
{
     	OS_TCB    *ptcb;

   	DisableAllInterrupts();
    	ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
    	if (ptcb != (OS_TCB *)0)    	{
        	OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
        	EnableAllInterrupts();
        	ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
        	ptcb->prio      =	prio;                       /* Load task priority into TCB              */
 
        	ptcb->id        = id;                         /* Store task ID                            */
		ptcb->state	=suspended;
        	ptcb->taskclass	=taskclass;
        	ptcb->autoact	=autoact;

		#if SCHEDULE==MIXPREEMPT	
        		ptcb->schedpcy	=schedpcy;
		#else
			#if SCHEDULE==PREEMPT
            		ptcb->schedpcy	=1;
			#endif

			#if SCHEDULE==NONPREEMPT
	      		ptcb->schedpcy	=0;
			#endif
		#endif
	
        	ptcb->OSTCBY         = (INT8U)(prio >> 3);         /* Pre-compute X, Y, BitX and BitY          */
        	ptcb->OSTCBBitY      = (INT8U)OSMapTbl[ptcb->OSTCBY];
        	ptcb->OSTCBX         = (INT8U)(prio & 0x07);
        	ptcb->OSTCBBitX      = (INT8U)OSMapTbl[ptcb->OSTCBX];


  	  	DisableAllInterrupts();
        
        	OSTCBidTbl[id] = ptcb;        	
		#if ((CC==BCC1)||(CC==ECC1))	
        		OSTCBPrioTbl[prio] = ptcb;
		#endif		
        	ptcb->OSTCBNext    = OSTCBList;                    /* Link into TCB chain                      */
        	ptcb->OSTCBPrev    = (OS_TCB *)0;
        	if (OSTCBList != (OS_TCB *)0)         	{
            	OSTCBList->OSTCBPrev = ptcb;
        	}
        	OSTCBList               = ptcb;
        
        	OSTaskCtr++;                                       /* Increment the #tasks counter             */
        	EnableAllInterrupts();
	
        	return (OS_ERR_NONE);
    	}
   
    	return (OS_ERR_TASK_NO_MORE_TCB);
}


void  OS_InitTaskIdle (void)
{
    #if OS_STK_GROWTH == 1
    (void)OSTaskCreate(TaskIdle,
                      (void *)0,
                       &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1]
                       ,512,OS_TASK_IDLE_PRIO,0,BT,1,1);
    #else
    (void)OSTaskCreate(TaskIdle,
                      (void *)0,
                       &OSTaskIdleStk[0],
                       512,OS_TASK_IDLE_PRIO,0,BT,1,1);
    #endif
}


#if (CC==BCC2)||(CC==ECC2)

void EnQueue(RdyQueue *Q,OS_TCB *x)
{ 
  OS_TCB *ptcb;
 
  if(Q->rear==(OS_TCB *)0) {
  	Q->front	=x;
	Q->rear	=x;
  } else {
  	Q->rear->RdyNext	=x;
	Q->rear	=x;
  }
}


OS_TCB *DeQueue(RdyQueue *Q)
{
  OS_TCB *ptcb;
  if (Q->front==(OS_TCB *)0) {
  	return (NO_TASK);
  } else {
	ptcb=Q->front;
	if (Q->rear==Q->front) {
		Q->front=(OS_TCB *)0;
		Q->rear=(OS_TCB *)0;
	} else {
		Q->front=Q->front->RdyNext;
	}
	return (ptcb);
  }
}

#endif
INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT32U stk_size, INT8U prio, INT8U id, INT8U taskclass,INT8U autoact, INT8U schedpcy)
{
    OS_STK    *psp;
    INT8U      err;



    	if (prio>OS_LOWEST_PRIO) {
	  	return(OS_PRIO_INVALID);
   	}
    
 #if ((CC==BCC1)||(CC==ECC1))  
	DisableAllInterrupts();
    	if ((OSTCBPrioTbl[prio] == (OS_TCB *)0)&&(OSTCBPrioTbl[prio] == (OS_TCB *)0))    	{ /* Make sure task doesn't already exist at this priority  */
        	OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
        	OSTCBidTbl[id] = (OS_TCB *)1;                                     /* ... the same thing until task is created.              */
        	EnableAllInterrupts();
        	psp = OSTaskStkInit(task, p_arg, ptos);              /* Initialize the task's stack         */
        	err = OS_TCBInit(psp,prio, id, stk_size, taskclass, autoact, schedpcy);
        	if (err == OS_ERR_NONE)         	{
	      	if (autoact==TRUE) 	      		{
		 		activatetask(id);
		  	}
         
        	} else         	{
           		DisableAllInterrupts();
            	OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
            	EnableAllInterrupts();
          	}
       	return (err);	
    	}
   
    	return (OS_ERR_PRIO_ID_EXIST);

#endif

#if ((CC==BCC2)||(CC==ECC2))
 
    	DisableAllInterrupts();
    	if (OSTCBidTbl[id] == (OS_TCB *)0)     	{ /* Make sure task doesn't already exist at this id */
         	OSTCBidTbl[id] = (OS_TCB *)1;
         	EnableAllInterrupts();
                                         
        	psp = OSTaskStkInit(task, p_arg, ptos);              /* Initialize the task's stack         */
        	err = OS_TCBInit(psp,prio, id, stk_size, taskclass, autoact, schedpcy);
        	if (err == OS_ERR_NONE) {
	       	if (autoact==TRUE) {
		 	  	activatetask(id);
		   	}
            
        	} else         	{
            	DisableAllInterrupts();
            	OSTCBidTbl[prio] = (OS_TCB *)0; /* Make this priority available to others  */
            	EnableAllInterrupts();
        	}
        	return (err);
   	 }
   	 //开中断
    	return (OS_ERR_ID_EXIST);

#endif
}


OS_STK *OSTaskStkInit(void (*task)(void *pd), void *p_arg, OS_STK *ptos)
{
	OS_STK     *stkp;                                                   /* Local: Stack pointer  */
   	OS_CPU_SR   msr;                                                    /* Local: Initial MSR */
  	OS_CPU_SR   srr1;                                                   /* Local: Initial SRR1*/
 
    	msr  =  CPU_SR_Rd();                                             /* get the MSB reg value   */
    	srr1 = (msr | 0x8000);                                           /* set MSR[EE] bit to enable interrupts */
    
    	stkp  = (OS_STK *)((INT32U) ptos & (INT32U) 0xFFFFFFF8);          /* 8-byte align task's stack pointer (EABI)*/
                                                                            
 /* Stack Frame Initialization*/
    *--stkp = (INT32U)msr;                                              /* MSR*/  
    *--stkp = (INT32U)task;                                             /* LR  */
    *--stkp = 0;                                                        /* CR*/
    *--stkp = 0;                                                        /* XER*/
    *--stkp = 0;                                                        /* CTR */
    *--stkp = (INT32U)srr1;                                             /* SRR1*/      
    *--stkp = (INT32U)task;                                             /* SRR0*/
    *--stkp = 0;                                                        /* R0*/
	
    *--stkp = 0x30L;                                                    /* r30  */
    *--stkp = 0x29L;                                                    /* r29  */
    *--stkp = 0x28L;                                                    /* r28  */
    *--stkp = 0x27L;                                                    /* r27 */
    *--stkp = 0x26L;                                                    /* r26 */
    *--stkp = 0x25L;                                                    /* r25 */
    *--stkp = 0x24L;                                                    /* r24  */
    *--stkp = 0x23L;                                                    /* r23 */
    *--stkp = 0x22L;                                                    /* r22 */
    *--stkp = 0x21L;                                                    /* r21 */
    *--stkp = 0x20L;                                                    /* r20  */
    *--stkp = 0x19L;                                                    /* r19  */
    *--stkp = 0x18L;                                                    /* r18 */
    *--stkp = 0x17L;                                                    /* r17  */
    *--stkp = 0x16L;                                                    /* r16  */
    *--stkp = 0x15L;                                                    /* r15   */
    *--stkp = 0x14L;                                                    /* r14  */
    *--stkp = 0x13L;                  						/* r13  */
    *--stkp = 0x12L;                                                    /* r12  */
    *--stkp = 0x11L;                                                    /* r11 */
    *--stkp = 0x10L;                                                    /* r10  */
    *--stkp = 0x9L;                                                     /* r09*/
    *--stkp = 0x8L;                                                     /* r08  */
    *--stkp = 0x7L;                                                     /* r07 */
    *--stkp = 0x6L;                                                     /* r06   */
    *--stkp = 0x5L;                                                     /* r05 */
    *--stkp = 0x4L;                                                     /* r04 */
    *--stkp = (INT32U)p_arg;                                            /* r03  */
    *--stkp = 0x2L;                                    			/* r02 */ 
    *--stkp = 0x1L;                                                     /* r01 */
    *--stkp = (INT32U)ptos;                                             /* Stack Ptr*/
    
    return(stkp);
}

static  void  OS_InitMisc (void){    OSIntNesting  = 0;                                     /* Clear the interrupt nesting counter      */        OSTaskCtr     = 0;                                     /* Clear the number of tasks                */    OSRunning     = FALSE;                              /* Indicate that multitasking not started   */    OSCtxSwCtr    = 0;                                     /* Clear the context switch counter         */    OSIdleCtr     = 0L;                                    /* Clear the 32-bit idle counter            */   } 
void  OSStart (void)
{
#if (CC==BCC1)||(CC==ECC1)
    if (OSRunning == FALSE) {
        OS_SchedNew();                               /* Find highest priority's task priority number   */
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();                            /* Execute target specific code to start task     */
    }
#endif

#if (CC==BCC2)||(CC==ECC2)
    if (OSRunning == FALSE) {
        OS_SchedNew();                               /* Find highest priority's task priority number   */
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = DeQueue(&OSTCBPrioTbl[OSPrioHighRdy]); /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();  
    }
#endif
   
}

void OSInit(void)
{
	OS_InitMisc(); 
	OS_InitRdyList();
	OS_InitTCBList();
	Init_RCBArray();
	OS_InitTaskIdle();
}

⌨️ 快捷键说明

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