欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

自己寫單片機操做系統3-任務創建和調度

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年01月31日   【字體:
如果存在兩個或以上的任務調度就需要將棧保CPU的寄存器了。這個地方就是各個MCU不同的地方了。
這個要看MCU進入中斷的流程才能知道棧需要怎么保護。

OS_STK* InitStkBuff(VOID_FUN_PTR task,OS_STK* pstk)
{
   pstk--;        
    *pstk = (U16)(((U32)task) >> 8);    存要執行的函數
    pstk--;                                
    *pstk = 0xFFFF; //IY        存y寄存器
    (pstk)--;
    *pstk = 0x1111; //IX        存x寄存器
    pstk--;
    *pstk = 0xAA;//A;            存A
    ((U8*)pstk)--;        A和B都是8位的在寄存器中是一起放在一個16位中的、
    *pstk = 0xBB; //B        存B
    ((U8*)pstk)--; //在中斷中需要多保存一次page頁,所以需要留一個空間出來
   return pstk;
}
 void CreatTask(VOID_FUN_PTR task,OS_STK *pStk,U8 stkSize,U8 osPior)
{
 OsTaskObjTbl[osPior].Task = task;
 OsTaskObjTbl[osPior].TaskSp = pStk;
 OsTaskObjTbl[osPior].stkSize = stkSize;
 OsTaskObjTbl[osPior].taskDly = 0;
 OsTaskObjTbl[osPior].taskState = TASK_STATE_READY;
 OsTaskObjTbl[osPior].nextTask = IdelTask;
 OsTaskObjTbl[osPior].TaskSp = InitStkBuff(task,pStk);       將修改后的sp給到任務的sp中
}
 任務調度函數

void Os_Schel(void)
{
 U8 i;
 OldTask = HeadTask;
 for(i = 0;i < TASK_SIZE;i++)
 {
  if(OsTaskObjTbl[i].taskState == TASK_STATE_READY) 直接查看任務的狀態,是否已經就緒
  {
   HeadTask = &OsTaskObjTbl[i];
   break;
  }
 }
 if(i == TASK_SIZE)
 {
  HeadTask = IdelTask;
 }
 
 OS_TASK_SW();啟動軟件中斷進入中斷調度
}
__interrupt VectorNumber_Vswi void OSCtxSw(void)   //4為SWI中斷
{
    DisableInterrupts;              //關中斷
  // PTP = 0xAA;
   asm{
        ldaa $30                    //保存頁面寄存器,單片機16位最大的flash只能是64k。但是128k需要通過頁面寄存器切換
        psha
        STS Sp_bf            將當前的sp賦值給sp_bf
       }
        OldTask->TaskSp = Sp_bf;    保存sp-bf
    Sp_bf = HeadTask->TaskSp;   取出sp的地址。
   asm{ 
        LDS Sp_bf                將sp-bf給SP  
        pula
        staa $30                  將頁面寄存器恢復
       }
    EnableInterrupts;             //開中斷   
}
這樣一個任務就調度出來了、
關閉窗口

相關文章