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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 經典單片機C51多任務代碼(改進版)

          經典單片機C51多任務代碼(改進版)

          作者: 時間:2016-11-29 來源:網絡 收藏

          if(RWCH_BZ==0)
          {//棧調整代碼
          SP+=2;//第一次切換程序時原棧沒有(POP PSW 和POP ACC 數(shù)據(jù)調整一下,為什么請查匯編代碼)
          //為什么要加上面代碼的分析
          //中斷中其實隱含了以下代碼
          //PUSH ACC
          //PUSH PSW
          //----------------

          本文引用地址:http://www.ex-cimer.com/article/201611/323535.htm

          //中斷內的實際代碼

          //----------------
          //下面兩句的數(shù)據(jù)在每個任務第一次切換時任務棧內其實并沒有它的數(shù)據(jù),如果不調整,這兩句將會把返回地址數(shù)據(jù)給POP掉
          //所以進行SP+2處理才會正常返回切換后的任務,從而騙過CPU
          //POP PSW
          //POP ACC
          //RET
          }
          //============================================
          //setb et1
          ET0=1;//開中斷
          //setb tr1
          TR0=1;//開定時器

          }
          //===================================

          //=======================================================================
          /*
          //網絡原碼
          #include

          #define MAX_TASKS 2 //任務槽個數(shù).必須和實際任務數(shù)一至
          #define MAX_TASK_DEP 12 //最大棧深.最低不得少于2個,保守值為12.
          unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任務堆棧.
          unsigned char task_id; //當前活動任務號
          unsigned char idata task_sp[MAX_TASKS];


          //任務切換函數(shù)(任務調度器)
          void task_switch(){
          task_sp[task_id] = SP;

          if(++task_id == MAX_TASKS)
          task_id = 0;

          SP = task_sp[task_id];
          }

          //任務裝入函數(shù).將指定的函數(shù)(參數(shù)1)裝入指定(參數(shù)2)的任務槽中.如果該槽中原來就有任務,則原任務丟失,但系統(tǒng)本身不會發(fā)生錯誤.
          void task_load(unsigned int fn, unsigned char tid){
          task_sp[tid] = task_stack[tid] + 1;
          task_stack[tid][0] = (unsigned int)fn & 0xff;
          task_stack[tid][1] = (unsigned int)fn >> 8;
          }

          //從指定的任務開始運行任務調度.調用該宏后,將永不返回.
          #define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}

          void task1(){
          static unsigned char i;
          while(1){
          i++;
          task_switch();//編譯后在這里打上斷點
          }
          }

          void task2(){
          static unsigned char j;
          while(1){
          j+=2;
          task_switch();//編譯后在這里打上斷點
          }
          }

          void main(){
          //這里裝載了兩個任務,因此在定義MAX_TASKS時也必須定義為2
          task_load(task1, 0);//將task1函數(shù)裝入0號槽
          task_load(task2, 1);//將task2函數(shù)裝入1號槽
          os_start(0);
          }
          */
          //=======================================================================


          上一頁 1 2 下一頁

          評論


          技術專區(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); })();