日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

自己寫單片機操做系統(tǒng)3-任務(wù)創(chuàng)建和調(diào)度

 共同成長888 2015-07-19

自己寫單片機操做系統(tǒng)3-任務(wù)創(chuàng)建和調(diào)度 

如果存在兩個或以上的任務(wù)調(diào)度就需要將棧保CPU的寄存器了。這個地方就是各個MCU不同的地方了。
這個要看MCU進入中斷的流程才能知道棧需要怎么保護。

OS_STK* InitStkBuff(VOID_FUN_PTR task,OS_STK* pstk)
{
   pstk--;        
    *pstk = (U16)(((U32)task) >> 8);    存要執(zhí)行的函數(shù)
    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給到任務(wù)的sp中
}
 任務(wù)調(diào)度函數(shù)

void Os_Schel(void)
{
 U8 i;
 OldTask = HeadTask;
 for(i = 0;i < TASK_SIZE;i++)
 {
  if(OsTaskObjTbl[i].taskState == TASK_STATE_READY) 直接查看任務(wù)的狀態(tài),是否已經(jīng)就緒
  {
   HeadTask = &OsTaskObjTbl[i];
   break;
  }
 }
 if(i == TASK_SIZE)
 {
  HeadTask = IdelTask;
 }
 
 OS_TASK_SW();啟動軟件中斷進入中斷調(diào)度
}
__interrupt VectorNumber_Vswi void OSCtxSw(void)   //4為SWI中斷

    DisableInterrupts;              //關(guān)中斷
  // PTP = 0xAA;
   asm{
        ldaa $30                    //保存頁面寄存器,單片機16位最大的flash只能是64k。但是128k需要通過頁面寄存器切換
        psha
        STS Sp_bf            將當(dāng)前的sp賦值給sp_bf
       }
        OldTask->TaskSp = Sp_bf;    保存sp-bf
    Sp_bf = HeadTask->TaskSp;   取出sp的地址。
   asm{  
        LDS Sp_bf                將sp-bf給SP   
        pula
        staa $30                  將頁面寄存器恢復(fù)
       }
    EnableInterrupts;             //開中斷    
}
這樣一個任務(wù)就調(diào)度出來了、

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多