中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

        作者: 時間:2016-11-29 來源:網(wǎng)絡 收藏

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

        本文引用地址:http://www.antipu.com.cn/article/201611/323535.htm

        //中斷內(nèi)的實際代碼

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

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

        //=======================================================================
        /*
        //網(wǎng)絡原碼
        #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ù)(任務調(diào)度器)
        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;
        }

        //從指定的任務開始運行任務調(diào)度.調(diào)用該宏后,將永不返回.
        #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ū)

        關閉