新聞中心

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

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

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

        最近剛把 DYS388 項目了結,期間寫了不少程序,寫著寫著想到了一下東西,于是總結了一下。

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

        一、什么是占用式程序

        一個進程在一個時刻只能處理一個任務。

        每個任務是為了完成一個功能,如果這個功能的實現過程是一直占用進程處理資源的話,就稱這個任務函數是占用式程序結構。

        最常見的占用式程序結構就是延時函數了,比如我最常用的5ms延時函數

        void delay5(unsigned char n)

        {

        unsigned int i;

        for(;n>0;n--)

        for(i=4700;i>0;i--); //12MHz,1T

        }

        在完成5ms功能過程中是一直占用調用它的進程處理資源的,在此期間不能進行其它任務。

        還有一個很常見的占用式程序——數碼管掃描,不過在這里我不舉數碼管掃描的例子,而舉這次在DYS388中使用的8*8彩色點陣屏的掃描程序:

        void refresh7()

        {

        unsigned char r;

        for(r=0;r8;r++) p=>

        {

        //掃描紅色

        DPw = ~(0x01

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

        DELAY7 (light7);//顯示時間長度

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        DELAY7 (32-light7);//滅燈時間長度

        //為了簡潔,這里把綠色和藍色的掃描程序省略,它們的結構和紅色掃描是一樣的

        }

        }

        這個函數是7色模式下的屏幕掃描程序,調用一次此函數會把整個屏幕掃描一遍。

        r代表行數,r循環8次代表屏幕的8個行;在每次循環里,先導通對應的行和需點亮的燈,然后延時light7個單位,再關閉所有顯示,再延時32-light7個單位。

        二、占用式程序的缺點

        占用式程序最大的缺點就是執行時間太長,耽誤對其它任務的響應。另外就是資源浪費,很多時間浪費在執行中的延時上。

        當然,可以在這些占用式程序中嵌入其它代碼以及時處理其它任務,但是這樣會造成程序結構混亂,嵌入的其它代碼還會影響本程序的執行。如果嵌入的代碼功能簡單還好,如果功能復雜,尤其是當嵌入的代碼也是占用式的,就會嚴重影響程序執行速度。

        三、對占用式程序的改造

        在此以DYS388的掃描程序為例,對其進行改造。

        首先,每次調用就掃描8行,耗時太長,現將其改成每次掃描一行:

        void refresh7()

        {

        static unsigned char r=0;

        //掃描紅色

        DPw = ~(0x01

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

        DELAY7 (light7);//顯示時間長度

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        DELAY7 (32-light7);//滅燈時間長度

        //為了簡潔,這里把綠色和藍色的掃描程序省略,它們的結構和紅色掃描是一樣的

        r++;

        if(r==8)

        r=0;

        }

        用一個靜態變量r來記憶行數,這樣每次調用此函數只需掃描一行,執行速度是原來的8倍,可以比較快地響應其它任務了。

        但是這樣還不夠,每次掃描都會掃描三種顏色,時間還是有點長,下面再次改造,改為每次只掃描一種顏色:

        void refresh7()

        {

        static unsigned char r=0;

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

        flagrgb++;

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

        {

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

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

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

        r=0;

        }

        switch(flagrgb)

        {

        case 0: //掃描紅色

        DPw = ~(0x01

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

        DELAY7 (light7);//顯示時間長度

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        DELAY7 (32-light7);//滅燈時間長度

        break;

        case 1: //掃描綠色

        //省略代碼

        break;

        case 2: //掃描藍色

        //省略代碼

        break;

        }

        }

        改造完成之后,執行時間再次縮短,變成了剛才的1/3。

        這下還沒完,我們發現每次掃描中都有延時,延時過程中什么也不做,這是極大的浪費,我們需要再此改造,把延時去掉:


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 班戈县| 礼泉县| 宜兰市| 阆中市| 开封市| 屏山县| 云阳县| 南溪县| 溆浦县| 光山县| 宜阳县| 大港区| 曲沃县| 兰州市| 浠水县| 平山县| 钟祥市| 酉阳| 綦江县| 奉化市| 永川市| 车致| 进贤县| 广东省| 罗甸县| 平凉市| 太谷县| 闽清县| 古丈县| 始兴县| 青川县| 灵武市| 宝坻区| 军事| 陈巴尔虎旗| 彭水| 宁强县| 会理县| 金门县| 遵化市| 赫章县|