walnutcy

Cy_OS 之任务切换 (原创)

0
阅读(2000)

其实任务切换很好理解,打个比方来说吧:

假如我有两套房子(是假如噢,目前我还没那有钱,就算有,也会卖掉用来做别的用途,呵呵,), 去B房前我是不是得把A房的门锁上啊,免得我不在的时候被贼娃子进去乱翻,虽说不一定被偷点啥,总要被弄乱或弄坏吧,说不定什么东西我就找不到了,在系统OS里,这个贼娃子就是其他的任务或中断,如果AA任务的场景没被锁住,就被别的任务搞坏了,那系统岂不乱了,还谈什么稳定性,全成了屁话,所以在做任务切换时我们一定要要求各个任务有自己房间(堆栈),有自己的锁(堆栈栈顶)。
void OSTaskSW (void) REENTRANT
{
      EnterCritical();    
     if (gOs.taskNum<2)  // 只有一套房子,没得选择,
                                       // 继续回去呆家里吧,
    {
         return;
    }
#pragma asm
      PUSHALL   //把东西收拾下,锁门。
#pragma endasm
     OsTaskSwitch();   // 到另一套房子去,并准备好钥匙
#pragma asm
     POPALL              // 开门了,开始把放到柜子里的烟啊,
                                 //酒啊,全拿出来爽吧,呵呵,
#pragma endasm
    ExitCritical();    
}
//翻口袋找钥匙啊,可别花太长时间,现如今社会动乱,
//一不小心,就有可能被抢啊,所以路上要小心,且要走得快
void OsTaskSwitch (void) REENTRANT
{
 U8 tmp;
 U8 tmpsp1;
 U8 tmpsp2;
 if (gOsShedLock)
 { return;
 }
 __asm POP DPL
 __asm POP DPH
 if (1==gOsIntLevel)
 {
  tmpsp1 = DPL;
  tmpsp2 = DPH;
  __asm POP DPL
  __asm POP DPH
 }
 tmp = gOs.currTask;
 gOs.tcb[tmp].sp = SP;
 if (OS_TASK_RUN==gOs.tcb[tmp].state)
 {
  gOs.tcb[tmp].state = OS_TASK_RDY;
 }
 for(tmp=0;tmp<OS_TASK_MAX_NUM;tmp++)
 {
  if (gOs.osPrio&(1<<tmp))
  { 
   if (OS_TASK_RDY==gOs.tcb[tmp].state)
   {
 //只有房子有美酒,香烟的才去,那些空屋子去了有什么意思,喝西北风啊??
    gOs.tcb[tmp].state = OS_TASK_RDY;   
    gOs.currTask = tmp;
    SP = gOs.tcb[tmp].sp;
    break;
   }
  } 
 }
 __asm PUSH DPH
 __asm PUSH DPL
 if (1==gOsIntLevel)
 {
  DPH = tmpsp2;
  DPL = tmpsp1;
  __asm PUSH DPH
  __asm PUSH DPL
 }
}
 
Baidu
map