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

📄 itf.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];

void     OS_Sched(void);
extern  void OSCtxSw(void);
INT8U  OSTaskChangePrio(INT8U id,INT8U oldprio, INT8U newprio)
{

    OS_TCB      *ptcb;
    INT8U        x;
    INT8U        y;

    INT8U        bitx;
    INT8U        bity;

    INT8U        y_old;


#if (CC==BCC1)||(CC==ECC1)

    if (oldprio >= OS_LOWEST_PRIO) {
        
            return (OS_ERR_PRIO_INVALID);
        
    }
    if (newprio >= OS_LOWEST_PRIO) {
        return (OS_ERR_PRIO_INVALID);
    }

    //DisableAllInterrupts();
    if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                 /* New priority must not already exist */
        //EnableAllInterrupts();
        return (OS_ERR_PRIO_EXIST);
    }
   
    ptcb = OSTCBPrioTbl[oldprio];
    if (ptcb == (OS_TCB *)0) {                                  /* Does task to change exist?          */
        //EnableAllInterrupts();                         /* No, can't change its priority!      */
        return (OS_ERR_PRIO);
    }
   

    //y                     = (INT8U)(newprio >> 3);              /* Yes, compute new TCB fields         */
    //x                     = (INT8U)(newprio & 0x07);
    //bity                  = (INT8U)(1 << y);
   // bitx                  = (INT8U)(1 << x);

	y         = (INT8U)(newprio >> 3);         /* Pre-compute X, Y, BitX and BitY          */
    bity      = (INT8U)OSMapTbl[y];
    x         = (INT8U)(newprio & 0x07);
    bitx      = (INT8U)OSMapTbl[x];

    OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                        /* Remove TCB from old priority        */
    OSTCBPrioTbl[newprio] = ptcb;                               /* Place pointer to TCB @ new priority */
    y_old                 = ptcb->OSTCBY;
    if ((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0) {             /* If task is ready make it not        */
        OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
        if (OSRdyTbl[y_old] == 0) {
            OSRdyGrp &= ~ptcb->OSTCBBitY;
        }
        OSRdyGrp    |= bity;                                    /* Make new priority ready to run      */
        OSRdyTbl[y] |= bitx;
    }

    ptcb->prio		= newprio;                                  /* Set new task priority               */
    ptcb->OSTCBY    = y;
    ptcb->OSTCBX    = x;
    ptcb->OSTCBBitY = bity;
    ptcb->OSTCBBitX = bitx;
	OSPrioCur	    = newprio;
   //EnableAllInterrupts();
    if (OSRunning == TRUE) {
                                         /* Find new highest priority task      */
	 OS_Sched();
    }
    return (OS_ERR_NONE);
#endif



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

 if (oldprio >= OS_LOWEST_PRIO) {
        
            return (OS_ERR_PRIO_INVALID);
       
    }
    if (newprio >= OS_LOWEST_PRIO) {
        return (OS_ERR_PRIO_INVALID);
    }

  // DisableAllInterrupts();
    ptcb = OSTCBidTbl[id];
    if (ptcb == (OS_TCB *)0) {                                  /* Does task to change exist?          */
        //EnableAllInterrupts();                         /* No, can't change its priority!      */
        return (OS_ERR_PRIO);
    }
   //EnableAllInterrupts();

    y                     = (INT8U)(newprio >> 3);              /* Yes, compute new TCB fields         */
    x                     = (INT8U)(newprio & 0x07);
    bity                  = (INT8U)(1 << y);
    bitx                  = (INT8U)(1 << x);
   //DisableAllInterrupts();
    DeQueue(&OSTCBPrioTbl[oldprio] );                        /* Remove TCB from old priority        */
    
    if (OSTCBPrioTbl[oldprio].front ==(OS_TCB *)0) {
          y_old                 = ptcb->OSTCBY;
          if ((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0) {             /* If task is ready make it not        */
                OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
                if (OSRdyTbl[y_old] == 0) {
                      OSRdyGrp &= ~ptcb->OSTCBBitY;
                }
          }
    }
    if (OSTCBPrioTbl[newprio].front ==(OS_TCB *)0) {
        OSRdyGrp    |= bity;                                    /* Make new priority ready to run      */
        OSRdyTbl[y] |= bitx;
    }
    EnQueue(&OSTCBPrioTbl[newprio],ptcb);                               /* Place pointer to TCB @ new priority */

    ptcb->prio		= newprio;                                  /* Set new task priority               */
    ptcb->OSTCBY    = y;
    ptcb->OSTCBX    = x;
    ptcb->OSTCBBitY = bity;
    ptcb->OSTCBBitX = bitx;
	OSPrioCur	    = newprio;
   //EnableAllInterrupts();
    if (OSRunning == TRUE) {
       OS_Sched();                                    /* Find new highest priority task      */
    }
    return (OS_ERR_NONE);


#endif
}


  void  OS_SchedNew (void)
{
              
    INT8U   y;


    y             = OSUnMapTbl[OSRdyGrp];
    OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
}



void  OS_Sched (void)
{


#if ((CC==BCC2) ||(CC==ECC2))
   //DisableAllInterrupts();
    if (OSIntNesting == 0) {                           
                
            OS_SchedNew();
            if (OSPrioHighRdy!=OSPrioCur) {
                
                 OSTCBHighRdy =DeQueue(&OSTCBPrioTbl[OSPrioHighRdy]);
                OSCtxSwCtr++;                          
                OSCtxSw();                        
            }
       
    }
    //EnableAllInterrupts();


#endif


#if ((CC==BCC1) || (CC==ECC1))
    //DisableAllInterrupts();
    if (OSIntNesting == 0) {                           
             
            OS_SchedNew();
            if (OSPrioHighRdy!=OSPrioCur) {
                  OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                 
                OSCtxSwCtr++;                          
                TaskSw();                        
            }
        
    }
   // EnableAllInterrupts();


#endif
}




void  TaskIdle (void)
{

    for (;;) {
        //DisableAllInterrupts();
        OSIdleCtr++;
        //EnableAllInterrupts();
        
    }
}



void  Wait (void)
{
  INT8U  y;  
OS_TCB *ptcb;
ptcb=OSTCBCur;
#if (CC==BCC1)||(CC==ECC1)
  
   // EnableAllInterrupts();
    y                       =  OSTCBCur->OSTCBY;  /* Task no longer ready                              */
    OSRdyTbl[y]            &= ~OSTCBCur->OSTCBBitX;
    if (OSRdyTbl[y] == 0) {
        OSRdyGrp &= ~OSTCBCur->OSTCBBitY;         
    }
    ptcb->state=waitting;
//EnableAllInterrupts();
#endif

#if (CC==BCC2)||(CC==ECC2)
    //DisableAllInterrupts();
    DeQueue(&OSTCBPrioTbl[ptcb->prio]);
    if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
	  if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	             OSRdyGrp &= ~ptcb->OSTCBBitY;
      	  }
    }
    ptcb->state=waitting;
//EnableAllInterrupts();
#endif
}



void release(INT8U id)
{
  OS_TCB     *ptcb;
#if (CC==BCC1)||(CC==ECC1)
  INT8U prio;
//DisableAllInterrupts();
              ptcb=OSTCBidTbl[id];
   
               prio=ptcb->prio;
               OSRdyGrp               |=ptcb->OSTCBBitY;
               OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
               ptcb->state=ready;
			   //开中断
#endif

#if (CC==BCC2)||(CC==ECC2)
//关中断
  ptcb=OSTCBidTbl[id];
  if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
        OSRdyGrp               |=ptcb->OSTCBBitY;                                  /* Make new priority ready to run      */
        OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
    }
    EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb); 
	ptcb->state=ready;
	//开中断

#endif

}

⌨️ 快捷键说明

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