<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 自己寫單片機操做系統(tǒng)3-任務創(chuàng)建和調度

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

          作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏
          如果存在兩個或以上的任務調度就需要將棧保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給到任務的sp中
          }
          任務調度函數(shù)

          void Os_Schel(void)
          {
          U8 i;
          OldTask = HeadTask;
          for(i = 0;i < TASK_SIZE;i++)
          {
          if(OsTaskObjTbl[i].taskState == TASK_STATE_READY) 直接查看任務的狀態(tài),是否已經(jīng)就緒
          {
          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; //開中斷
          }
          這樣一個任務就調度出來了、


          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();