在时钟中断里,退出时调用 OSIntExit();        //触发任务切换软中断

  在这个函数中,比较当前任务指针是否发生了改变,若发生了改变,说明需要进行任务切换了。

  下面再看看延时函数OSTimeDly (int32 ticks)

void  OSTimeDly (int32 ticks)
{
    OS_CPU_SR  cpu_sr = 0;
    int8   index;
    TCB    *pTCB;
 
    OS_ENTER_CRITICAL();
    OSCurTCB->TCBDelay = ticks;
    OSNewTCB = NULL;
   /*任务优先级查找算法,从当前任务
    向后遍历,第一个大的优先级的任务
    是需要调度进去的任务*/
    for (index = 0; index < TaskNUM;index++)
    {
       pTCB = OSTCBTable+index;
       /*跳过睡眠任务*/
       if (pTCB->TCBDelay != 0)
       {
           continue;
       }
       /*跳过挂起任务*/
       if  (pTCB->TaskStat == OS_Task_Pend)
       {  
            continue;
       }
      /*找到了高优先级的任务,
       并且比当前任务优先级高*/
      if (OSCurTCB->CurPriority < pTCB->CurPriority)
     {
         OSNewTCB = pTCB;
         break;
      }
      /*找到了比当前优先级低的任务*/
     if (OSCurTCB->CurPriority > pTCB->CurPriority)
     {
         /*如果当前任务之前有同优先级的绪任务,
         则选择该任务,否则使用*/
        if (OSNewTCB == NULL)
        {
            OSNewTCB = pTCB;
        }      
        break;
  }
 
  /*找到了高优先级的任务,
    并且跟当前任务优先级相等*/
  if (OSCurTCB->CurPriority == pTCB->CurPriority)
  {
     /*该任务在当前任务之后*/
     if ((pTCB > OSCurTCB))
     {
          OSNewTCB = pTCB;
          break  ;
     }
   /*在当前任务之前或者是当前任务
     则还需要继续向后搜索第一个同优先级的任务*/
    if (((pTCB < OSCurTCB)||(pTCB == OSCurTCB))
        &&(OSNewTCB == NULL))
    {
         OSNewTCB = pTCB;
         continue;
    }
  }
 
 }
 OS_EXIT_CRITICAL();
 OSTaskSche();
}

  延时函数也很简单,是一方面把需要延时的时间给任务控制结构体中的延时变量,一方面查找高优先级的任务开始进行任务切换。以上完成了简单的任务切换和调度。从上面可以看出,查找效率是很低的,尤其是任务数目多的时候,需要从头到尾的遍历一遍数组。创建任务和查找高优先级的任务都有改进的空间,如果以后想到更好的更有效的方法再改一改,试一试。

  以上实现了简单的任务调度和切换。接下来,是任务间如何进行同步和通讯...

  在CSDN资源中可以下载工程的源码,KEILMDK4.23的IDE