在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

            作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏
            以前曾經(jīng)發(fā)布過(guò)一篇http://www.51hei.com/mcu/1616.html 這個(gè)是改進(jìn)版,修正了幾個(gè)小問(wèn)題.

            //說(shuō)明本源碼來(lái)自網(wǎng)絡(luò)(DIY超輕量級(jí)多任務(wù)操作系統(tǒng)一文)
            //============================================================================
            //51實(shí)用多任務(wù)源碼,歡迎引用改進(jìn),有新改進(jìn)功能請(qǐng)回發(fā)一份給我謝謝!(請(qǐng)發(fā)郵箱)
            //改進(jìn)為定時(shí)中斷內(nèi)切換任務(wù)
            //任務(wù)內(nèi)可以設(shè)定時(shí)間片長(zhǎng)短,通過(guò)改定時(shí)器0初置的方法實(shí)現(xiàn)
            //置定時(shí)器0 TL0=0xFF;的方法可以讓出CPU使用權(quán)
            //七彩驚云改進(jìn),QQ540953860 13880880726 胥先生
            //采用本源碼請(qǐng)保留各改進(jìn)人的聯(lián)系信息,以便共享和完善,請(qǐng)將各改進(jìn)前版本備注在代碼后面以便了解發(fā)展
            //步驟和各種不同檔次單片機(jī)下的靈活引用。
            //請(qǐng)對(duì)每一句代碼進(jìn)行備注謝謝!
            //============================================================================
            //============================================================================
            //你的改進(jìn)說(shuō)明寫(xiě)這兒
            //============================================================================
            #include

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

            #define MAX_TASKS 2 //任務(wù)槽個(gè)數(shù).必須和實(shí)際任務(wù)數(shù)一至
            #define MAX_TASK_DEP 12 //最大棧深.最低不得少于2個(gè),保守值為12.
            //根據(jù)程序嵌套層數(shù)調(diào)整該值大小,同時(shí)要算一下會(huì)不會(huì)溢出,這里的設(shè)置很重要。
            //還有就是重入問(wèn)題,局部變量在任務(wù)切換時(shí)有可能被另外的任務(wù)改寫(xiě)。
            //#define MAX_TASK_DEP 24 //最大棧深.最低不得少于2個(gè),24.
            unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任務(wù)堆棧數(shù)組.
            unsigned char task_id; //當(dāng)前活動(dòng)任務(wù)號(hào)
            unsigned char idata task_sp[MAX_TASKS];//棧指標(biāo)存放數(shù)組
            bit RWCH_BZ=0;//任務(wù)切換標(biāo)志變量

            /*
            //任務(wù)切換函數(shù)(任務(wù)調(diào)度器)
            void task_switch(){ //本子程序可以用來(lái)讓出CPU使用權(quán)
            task_sp[task_id] = SP; //存當(dāng)前任務(wù)SP的值

            if(++task_id == MAX_TASKS) //任務(wù)號(hào)++并比較,到最大置0以便重復(fù)切換任務(wù)
            task_id = 0;

            SP = task_sp[task_id]; //讀取下一任務(wù)SP值,
            } */

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

            //從指定的任務(wù)開(kāi)始運(yùn)行任務(wù)調(diào)度.調(diào)用該宏后,將永不返回.
            #define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}
            //這里其實(shí)就是以改寫(xiě)SP指針的方法,返回時(shí)不再返回調(diào)用本子程序的地方,而返回被新設(shè)定的SP指針指向的任務(wù)1首地址處運(yùn)行。

            /*============================以下為測(cè)試代碼============================*/

            void task1(){ //任務(wù)1
            static unsigned char i;
            while(1){
            i++;
            }
            }

            void task2(){//任務(wù)2
            static unsigned char j;
            while(1){
            j+=2;
            TL0=0xFF;//用置TL0的辦法來(lái)進(jìn)行讓定時(shí)中斷動(dòng)作從而進(jìn)行任務(wù)切換,讓出CPU使用權(quán)給下一任務(wù)的方法更好

            }
            }

            void main(){
            //這里裝載了兩個(gè)任務(wù),因此在定義MAX_TASKS時(shí)也必須定義為2

            //=============================================================
            //單片機(jī)初始化
            // mov tmod,#20h ;串口通訊設(shè)置 串口方式3 波特9600 晶振11.59適用
            //TMOD=0x20;//定時(shí)器1方式2
            TMOD=0x22;//定時(shí)器0方式2,定時(shí)器1方式2
            // mov Tl1,#0fdh ;
            TL1=0xfa;
            // mov th1,#0fdh ; TEL:028-89951522 轉(zhuǎn)載請(qǐng)勿刪除,謝謝!
            TH1=0xfa;
            // mov pcon,#128d ;QQ:540953860
            //PCON=128;
            PCON=0x80;
            // mov sp,#60h
            //SP=0x60;
            IP=16;//串口中斷設(shè)為高優(yōu)先級(jí)
            // mov scon,#0e0h
            SCON=0xf0;//為e0時(shí)禁止接收數(shù)據(jù)
            //setb tr1
            TR1=1;//開(kāi)啟定時(shí)器1
            TR0=1;//開(kāi)啟定時(shí)器0
            ET0=1;//開(kāi)定時(shí)器0中斷
            TL0=0x50;//定時(shí)器0初值設(shè)定
            TH0=0x50;//在中斷中設(shè)置它可實(shí)現(xiàn)時(shí)間片調(diào)整
            // setb ea

            //=============================================================
            task_load(task1, 0);//將task1函數(shù)裝入0號(hào)槽
            task_load(task2, 1);//將task2函數(shù)裝入1號(hào)槽
            EA=1;//開(kāi)中斷
            os_start(0); //進(jìn)入任務(wù)1
            }
            ckzd() interrupt 4 using 1//串行中斷入口
            {

            }

            timer0zd() interrupt 1 using 2//定時(shí)器0中斷入口
            {

            //clr tr1;關(guān)閉定時(shí)器
            TR0=0;
            //clr et1;關(guān)閉定時(shí)中斷
            ET0=0;
            // task_switch();//切換任務(wù)
            //===========================================
            //切換任務(wù)
            task_sp[task_id] = SP;

            if(++task_id == MAX_TASKS)
            {
            task_id = 0;
            RWCH_BZ=1;//當(dāng)task_id==0時(shí)說(shuō)明所有任都切換了一次,置標(biāo)志不再對(duì)棧進(jìn)行調(diào)整。
            }
            SP = task_sp[task_id];


            上一頁(yè) 1 2 下一頁(yè)

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉