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

📄 taskapi.c.svn-base

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


INT8U activatetask(INT8U id)
{   
    	INT8U        prio;
	OS_TCB	*ptcb;
  #if (CC==BCC1)||(CC==ECC1)
      DisableAllInterrupts();
       if(OSTCBidTbl[id]!=(OS_TCB *)0) {
           	ptcb = OSTCBidTbl[id];
           	if(ptcb->state==suspended) {
               	prio=ptcb->prio;
               	OSRdyGrp               |=ptcb->OSTCBBitY;
              	OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
              	ptcb->state=ready;
			EnableAllInterrupts();
		 if ((OSRunning ==TRUE)&&(OSTCBCur->schedpcy==PREEMPT)) {	   
	             OS_Sched();
		 }
		 
               return(E_OK);
            }else {
              
                 if(ptcb->state!=ready)                 	{
				EnableAllInterrupts();
                    	return(E_OS_ID);                    	}
            }
           
        }else {
       	EnableAllInterrupts();
            return(E_OS_ID);
        }
  #endif    

  #if CC==BCC2
      	DisableAllInterrupts();
        	if(OSTCBidTbl[id]!=(OS_TCB*)0) {
           		ptcb=OSTCBidTbl[id];
           		if(ptcb->state==suspended) {
               		prio=ptcb->prio;
		 		if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {	   
                    		OSRdyGrp                |=ptcb->OSTCBBitY;
                    		OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
		 		}
		 		EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
               		ptcb->state=ready;
               		atvtimes[id]++;
				EnableAllInterrupts();
		 		if ((OSRunning ==TRUE)&&(OSTCBCur->schedpcy==PREEMPT)) 					{	   
	             		OS_Sched();
		 		}
		    
               		return(E_OK);
            	}else {
          
                 		if(ptcb->state=ready) {
                    		if(atvtimes[id]<MAXTIMES)                    			{
                       			atvtimes[id]++;
						EnableAllInterrupts();						}
                 		else return(E_OS_LIMIT);
                	} 
            	}
           
       }else {
         	EnableAllInterrupts();
            return(E_OS_ID);
         }
  #endif    

  #if CC==ECC2
	DisableAllInterrupts();
	if(OSTCBidTbl[id]!=(OS_TCB*)0)       	{
          	ptcb=OSTCBidTbl[id];
           	if (ptcb->state==suspended)            	{
            	prio=ptcb->prio;
		      if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) 		      	{		   
                  	OSRdyGrp               |=ptcb->OSTCBBitY;
                    	OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
			}
		      EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
               	ptcb->state=ready;
               	if(ptcb->taskclass==BT)                		{
                   	atvtimes[id]++;
               		}
		 	EnableAllInterrupts();
		 	if ((OSRunning ==TRUE)&&(OSTCBCur->schedpcy==PREEMPT)) 		 	{	   
	             	OS_Sched();
		     	} 
	           
               	return(E_OK);
			   
            
		}else 		{
          		EnableAllInterrupts();
                 	if ((ptcb->state==ready)&&(ptcb->taskclass==BT))                  	{                     
                         if(atvtimes[id]<MAXTIMES)                          	{
					DisableAllInterrupts();
                            	atvtimes[id]++;
					EnableAllInterrupts();
					return(E_OK); 
                         } else                          	return(E_OS_LIMIT);
                         
                 } else                  	return(E_OS_ID);
               
		}	} else 	{
      	EnableAllInterrupts();
            return(E_OS_ID);
       }
  #endif 
}







INT8U terminatetask(void)
{
  OS_TCB    *ptcb;
 #if CC==BCC1
      
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
     DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	    EnableAllInterrupts();
          return(TASKIDLE);
      } 
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
            return(E_OS_RESOURCE);
      }
      if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	OSRdyGrp &= ~ptcb->OSTCBBitY;
      	}
       ptcb->state=suspended;
       EnableAllInterrupts();
       OS_Sched();
         
  #endif    

  #if CC==BCC2
      
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
      DisableAllInterrupts();
	ptcb=OSTCBCur;    	
      if(ptcb->prio==OS_IDLE_PRIO) {
	    EnableAllInterrupts();
          return(TASKIDLE);
      } 
     
      if (ptcb->ResourceNesting>0) {
 	    EnableAllInterrupts();
          return(E_OS_RESOURCE);
      }
          
          atvtimes[ptcb->id]--;
          if(atvtimes[ptcb->id]>0) {
              
              
              ptcb->state=ready;
          } else {
              DeQueue(&OSTCBPrioTbl[ptcb->prio]);
          	if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
			if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	             OSRdyGrp &= ~ptcb->OSTCBBitY;
      	              }
          	}
              ptcb->state=suspended;
          }	  
       	EnableAllInterrupts();      
          	OS_Sched();
         
     
  #endif

  #if CC==ECC1
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
      DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	    EnableAllInterrupts();
          return(TASKIDLE);
      } 
	  
          
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
          	return(E_OS_RESOURCE);
      }
	if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	OSRdyGrp &= ~ptcb->OSTCBBitY;
         }
         
      ptcb->state=suspended;
	EnableAllInterrupts();
      OS_Sched();
        
  #endif    
      

  #if CC==ECC2
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
     	DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	  	EnableAllInterrupts();
          	return(TASKIDLE);
      } 
      
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
          	return(E_OS_RESOURCE);
      }
              
            if ((ptcb->taskclass==BT)&&(--atvtimes[ptcb->id]>0)) {
		    
                    ptcb->state=ready;
            } else {
                 	DeQueue(&OSTCBPrioTbl[ptcb->prio]);
          	       if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
			     if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	                  OSRdyGrp &= ~ptcb->OSTCBBitY;
      	                   }
          	
                          ptcb->state=suspended;
                     }
             } 
                	
             EnableAllInterrupts();
             OS_Sched();
          
 #endif             
}             






INT8U chaintask(INT8U id)
{
   OS_TCB    *ptcb;
   OS_TCB    *ptcb1;
   INT8U         prio;
 #if CC==BCC1
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
	DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	  	EnableAllInterrupts();
          	return(TASKIDLE);
     	} 
     
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
          	return(E_OS_RESOURCE);
      }
	if (OSTCBCur==OSTCBidTbl[id]) {
	  	EnableAllInterrupts();
	     OS_Sched();
	     return(E_OK);
      	}	  	
       if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	OSRdyGrp &= ~ptcb->OSTCBBitY;
      	}
       ptcb->state=suspended;
      
       if(OSTCBidTbl[id]!=(OS_TCB*)0) {
           ptcb=OSTCBidTbl[id];
           if(ptcb->state==suspended) {
               prio=ptcb->prio;
               OSRdyGrp               |=ptcb->OSTCBBitY;
               OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
               ptcb->state=ready;
	         EnableAllInterrupts();
               OS_Sched();
           } else {
                 EnableAllInterrupts();
              return(E_OS_ID);
           }
       }  else {
        	EnableAllInterrupts();
            return(E_OS_ID);
       } 
  #endif    

  #if CC==BCC2
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
	DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	  	EnableAllInterrupts();
          	return(TASKIDLE);
      } 
     
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
          	return(E_OS_RESOURCE);
      }
      if (OSTCBCur==OSTCBidTbl[id]) {
	  	EnableAllInterrupts();
	     	OS_Sched();
	    	return(E_OK);
      	}
	  	
          atvtimes[ptcb->id]--;
          if(atvtimes[ptcb->id]>0) {
              
              
              ptcb->state=ready;
          } else {
              DeQueue(&OSTCBPrioTbl[ptcb->prio]);
          	if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
			if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	             OSRdyGrp &= ~ptcb->OSTCBBitY;
      	              }
          	}
              ptcb->state=suspended;
          }	  
       if(OSTCBidTbl[id]!=(OS_TCB*)0) {
           ptcb=OSTCBidTbl[id];
           if(ptcb->state==suspended) {
               prio=ptcb->prio;
		 if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {	   
                    OSRdyGrp               |=ptcb->OSTCBBitY;
                    OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
		 }
		 EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
               ptcb->state=ready;
               atvtimes[id]++;
		   EnableAllInterrupts();
		 
	        OS_Sched();
           } else {
          
                 if(ptcb->state=ready) {
                    if(atvtimes[id]<MAXTIMES)
                       atvtimes[id]++;
			     EnableAllInterrupts();		
                    else return(E_OS_LIMIT);
                  } 
           }
       }
	
  #endif

  #if CC==ECC1
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
	DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	    EnableAllInterrupts();
          return(TASKIDLE);
      } 
     
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
          	return(E_OS_RESOURCE);
      }
       if (OSTCBCur==OSTCBidTbl[id]) {
	  	EnableAllInterrupts();
	     	OS_Sched();
	     	return(E_OK);
      	}	  	
       if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	OSRdyGrp &= ~ptcb->OSTCBBitY;
      	}
       ptcb->state=suspended;
          ptcb1=OSTCBidTbl[id];
          if(ptcb1->state==waitting) {
              return(E_OS_ID);
           } else {
                       activatetask(id);
           }            
          OS_Sched();
        
  #endif    
      

  #if CC==ECC2
      if(OSIntNesting>0) {
          return(E_OS_CALLEVEL);
      }
	DisableAllInterrupts();
      ptcb=OSTCBCur;
      if(ptcb->prio==OS_IDLE_PRIO) {
	  	EnableAllInterrupts();
          	return(TASKIDLE);
      } 
     
          
      if (ptcb->ResourceNesting>0) {
		EnableAllInterrupts();
          	return(E_OS_RESOURCE);
      	}
            if ((ptcb->taskclass==BT)&&(--atvtimes[ptcb->id]>0)) {
		    
                    ptcb->state=ready;
            } else {
                 	DeQueue(&OSTCBPrioTbl[ptcb->prio]);
          	       if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
			     if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
	  	                  OSRdyGrp &= ~ptcb->OSTCBBitY;
      	                   }
          	
                          ptcb->state=suspended;
                     }
             } 
              
            if(OSTCBidTbl[id]!=(OS_TCB*)0) {
                ptcb=OSTCBidTbl[id];
                if (ptcb->state==suspended) {
                    prio=ptcb->prio;
		      if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {		   
                         OSRdyGrp               |=ptcb->OSTCBBitY;
                         OSRdyTbl[ptcb->OSTCBY]  |=ptcb->OSTCBBitX;
		      }
		      EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
                    ptcb->state=ready;
                    if(ptcb->taskclass==BT) {
                        atvtimes[id]++;
                    }
		      	EnableAllInterrupts();
                    	OS_Sched();
                } else {
                     	EnableAllInterrupts();
                     if ((ptcb->state==ready)&&(ptcb->taskclass==BT)) {
                      
                         if(atvtimes[id]<MAXTIMES) {
					DisableAllInterrupts();
                            	atvtimes[id]++;
				 	EnableAllInterrupts();
                           	OS_Sched();
				      return(E_OK);
                         } else return(E_OS_LIMIT);
                         
                 } else return(E_OS_ID);
		}
               
       } else {
       EnableAllInterrupts();
              return(E_OS_ID);
       }
 #endif             
}





void   schedule(void)
{
    OS_Sched();
}




INT8U GetTaskId(void)
{

	 DisableAllInterrupts();
  	if (OSTCBCur!=(OS_TCB*)0)  	{
  		EnableAllInterrupts();
  		return(OSTCBCur->id);
  	}  	else  	{   		EnableAllInterrupts();
  		return(INVALID_TASK);  	}
}


INT8U GetTaskState(INT8U id)
{
  	OS_TCB 	*ptcb;
  	DisableAllInterrupts();
  	ptcb=OSTCBidTbl[id];
  	if(ptcb!=(OS_TCB*)0)  	{
  		EnableAllInterrupts();
  		return(ptcb->state);  	}
 	else 	{ 
  		EnableAllInterrupts();
  		return(E_OS_ID);
	}}

⌨️ 快捷键说明

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