新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 占用式和非占用式程序結構分析

        占用式和非占用式程序結構分析

        作者: 時間:2018-08-15 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201808/386850.htm

        void refresh7()

        {

        static unsigned char r=0;

        static unsigned char flagrgb=0; //當前需要點亮的顏色,0-R,1-G,2-B

        static unsigned char num=0;

        num++;

        if(num==32)

        {

        num=0;

        flagrgb++;

        if(flagrgb==3) //說明三種顏色都掃描完了

        {

        flagrgb=0; //從紅色開始掃描

        r++; //開始掃描下一行

        if(r==8) //如果發現行都掃描結束則從第行開始掃描

        r=0;

        }

        }

        if(num

        {

        switch(flagrgb)

        {

        case 0: //掃描紅色

        DPw = ~(0x01

        DPr = ~vm7r[r];//送入R燈IO接口顯示

        break;

        case 1: //掃描綠色

        DPw = ~(0x01

        DPg = ~vm7g[r];

        break;

        case 2: //掃描藍色

        DPw = ~(0x01

        DPb = ~vm7b[r];

        break;

        }

        }

        else //說明不需要點亮

        {

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        }

        }

        現在,這個函數中沒有任何延時和循環,執行所消耗的時間是非常少的,可以很快地響應響應其它任務。

        四、改造的本質

        上面我們對DYS388的掃描程序進行了“三大改造”,分別是:1、各個行掃描的分離;2、各個顏色掃描的分離;3、延時函數的消除。

        這些改造的本質都是對原程序的分割,把一大坨程序分成多個步驟分別執行,以減小耗時,提高對外部的響應速度。

        但就整個進程的執行來看,有效代碼的比例是降低的,包括上面“三大改造”的第三點 延時函數的消除,看上去是消除了延時函數,提高了執行效率,但從“掃描一次整屏”這個任務來看,其執行的代碼量反而是增加的。(但并不是所有的改造都一定會使效率降低,有些改造確實可以達到“消除延時函數”的目的)

        那為什么還要對其進行改造呢,見下節分析。

        五、非占用式程序結構的優勢

        1、非占用式程序相比于占用式程序,增加了一定的代碼,雖然會使整體效率降低,但是提高了各個任務之間的切換速度,可以對各個任務都能很快地響應。這點類似于操作系統,雖然降低了效率,但是各個任務間的快速切換可以達到各個任務“并行處理”的效果,光是這點的好處就已經很大了。

        2、非占用式程序結構可以放進定時器

        之前寫過一片《單片機用定時器分配任務程序結構總結》已經發現用定時器分配任務的好處,有些簡短的代碼可以直接放進定時器里。

        在改造之前的掃描程序是不適合放在定時器中斷處理程序里執行的,因為太長,可能還沒執行完就來了下一個中斷。就算勉強執行完了,留給主進程處理其它事情的時間也不多了。

        而改為非占用式之后,可以在中斷處理程序里直接調用掃描程序,它會很快地執行完,然后有充足的時間留給其他任務。

        3、非占用式程序并不是一定會降低效率。

        先拿“三大改造”的第三點說明,它雖然形式上消除了延時函數,但是每次調用此函數時對num變量的處理,以及有其產生的相關判斷語句,總的代碼量比原來的要多。

        但是,這真的就僅僅是這樣了嗎?改造之前的函數,執行玩退出之后所有的led全是熄滅的,只有在此函數執行過程中(延時階段)才會點亮(傳統數碼管掃描亦是如此)。

        而改造之后的函數,它的功能就是指定一下每個燈的亮滅,然后立馬退出,在執行其它任務的過程中該點亮的燈是在點亮的狀態。這樣就提高了整體的亮度,在執行其他任務的過程中,從某種意義上說也是在執行當前任務。

        這可能還不能太清楚地說明問題,下面我要再舉一例,傳統的按鍵掃描一般是這樣:

        if(key==0) //key是某個引腳

        {

        delay5(1);

        if(key==0) //確認按鍵已按下

        {

        //do something

        }

        }

        這段代碼也是很浪費時間的,中間有個5ms延時拜拜浪費。

        通過對它改造之后,結合定時器,可以幾乎完全地把這5ms時間省出來:

        static unsigned char keylast; //保存上次的按鍵值

        if(key==0 keylast==1) //檢測到一個下降沿

        {

        //do something

        }

        keylast=key;

        結合定時器進行改造,是真的可以把占用式函數的延時時間節省出來的。

        六、非占用式程序的一般結構

        非占用式程序將占用式程序分割執行,需要用到靜態變量對當前步驟進行記憶,其一般結構如下:

        邏輯變量計算就是根據任務功能構建出一個合理的邏輯結構。

        對邏輯變量的響應就是對構建好的邏輯結構的結果的響應和執行。

        七、結論

        最近開發 DYS388 寫了不少程序,以前在寫程序的過程中就隱約發現了所謂占用式和非占用式程序結構的區別,程序寫多了肯定能發現問題,但是如果不停下來總結,而是一味的開發,那是不會有進步的。

        組織龐大的程序需要正確的理論指導,學習很多的知識也需要進行總結。知識點太多不可能學完,只有將他們提升到理論層次,將這種思維方式刻在腦子里才能靈活地運用,并從容地接受新的知識。


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 牡丹江市| 宁波市| 泰安市| 东丰县| 五河县| 元谋县| 兴义市| 盐池县| 焦作市| 曲沃县| 沙田区| 新宁县| 安溪县| 华坪县| 庐江县| 中宁县| 上虞市| 叙永县| 大宁县| 华安县| 西乡县| 大名县| 厦门市| 那坡县| 梁河县| 玉溪市| 深泽县| 彩票| 北宁市| 大连市| 大同县| 土默特右旗| 铜鼓县| 大石桥市| 乌拉特后旗| 锦州市| 淳化县| 大渡口区| 临安市| 汉沽区| 汉寿县|