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

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

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

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

      2. 新聞中心

        EEPW首頁(yè) > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > 占用式和非占用式程序結(jié)構(gòu)分析

        占用式和非占用式程序結(jié)構(gòu)分析

        作者: 時(shí)間:2018-08-15 來源:網(wǎng)絡(luò) 收藏

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

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

        一、什么是占用式程序

        一個(gè)進(jìn)程在一個(gè)時(shí)刻只能處理一個(gè)任務(wù)。

        每個(gè)任務(wù)是為了完成一個(gè)功能,如果這個(gè)功能的實(shí)現(xiàn)過程是一直占用進(jìn)程處理資源的話,就稱這個(gè)任務(wù)函數(shù)是占用式程序結(jié)構(gòu)。

        最常見的占用式程序結(jié)構(gòu)就是延時(shí)函數(shù)了,比如我最常用的5ms延時(shí)函數(shù)

        void delay5(unsigned char n)

        {

        unsigned int i;

        for(;n>0;n--)

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

        }

        在完成5ms功能過程中是一直占用調(diào)用它的進(jìn)程處理資源的,在此期間不能進(jìn)行其它任務(wù)。

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

        void refresh7()

        {

        unsigned char r;

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

        {

        //掃描紅色

        DPw = ~(0x01

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

        DELAY7 (light7);//顯示時(shí)間長(zhǎng)度

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        DELAY7 (32-light7);//滅燈時(shí)間長(zhǎng)度

        //為了簡(jiǎn)潔,這里把綠色和藍(lán)色的掃描程序省略,它們的結(jié)構(gòu)和紅色掃描是一樣的

        }

        }

        這個(gè)函數(shù)是7色模式下的屏幕掃描程序,調(diào)用一次此函數(shù)會(huì)把整個(gè)屏幕掃描一遍。

        r代表行數(shù),r循環(huán)8次代表屏幕的8個(gè)行;在每次循環(huán)里,先導(dǎo)通對(duì)應(yīng)的行和需點(diǎn)亮的燈,然后延時(shí)light7個(gè)單位,再關(guān)閉所有顯示,再延時(shí)32-light7個(gè)單位。

        二、占用式程序的缺點(diǎn)

        占用式程序最大的缺點(diǎn)就是執(zhí)行時(shí)間太長(zhǎng),耽誤對(duì)其它任務(wù)的響應(yīng)。另外就是資源浪費(fèi),很多時(shí)間浪費(fèi)在執(zhí)行中的延時(shí)上。

        當(dāng)然,可以在這些占用式程序中嵌入其它代碼以及時(shí)處理其它任務(wù),但是這樣會(huì)造成程序結(jié)構(gòu)混亂,嵌入的其它代碼還會(huì)影響本程序的執(zhí)行。如果嵌入的代碼功能簡(jiǎn)單還好,如果功能復(fù)雜,尤其是當(dāng)嵌入的代碼也是占用式的,就會(huì)嚴(yán)重影響程序執(zhí)行速度。

        三、對(duì)占用式程序的改造

        在此以DYS388的掃描程序?yàn)槔瑢?duì)其進(jìn)行改造。

        首先,每次調(diào)用就掃描8行,耗時(shí)太長(zhǎng),現(xiàn)將其改成每次掃描一行:

        void refresh7()

        {

        static unsigned char r=0;

        //掃描紅色

        DPw = ~(0x01

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

        DELAY7 (light7);//顯示時(shí)間長(zhǎng)度

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        DELAY7 (32-light7);//滅燈時(shí)間長(zhǎng)度

        //為了簡(jiǎn)潔,這里把綠色和藍(lán)色的掃描程序省略,它們的結(jié)構(gòu)和紅色掃描是一樣的

        r++;

        if(r==8)

        r=0;

        }

        用一個(gè)靜態(tài)變量r來記憶行數(shù),這樣每次調(diào)用此函數(shù)只需掃描一行,執(zhí)行速度是原來的8倍,可以比較快地響應(yīng)其它任務(wù)了。

        但是這樣還不夠,每次掃描都會(huì)掃描三種顏色,時(shí)間還是有點(diǎn)長(zhǎng),下面再次改造,改為每次只掃描一種顏色:

        void refresh7()

        {

        static unsigned char r=0;

        static unsigned char flagrgb=0; //當(dāng)前需要點(diǎn)亮的顏色,0-R,1-G,2-B

        flagrgb++;

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

        {

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

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

        if(r==8) //如果發(fā)現(xiàn)行都掃描結(jié)束則從第行開始掃描

        r=0;

        }

        switch(flagrgb)

        {

        case 0: //掃描紅色

        DPw = ~(0x01

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

        DELAY7 (light7);//顯示時(shí)間長(zhǎng)度

        DPw=0xff;

        DPr=0xff;

        DPg=0xff;

        DPb=0xff;

        DELAY7 (32-light7);//滅燈時(shí)間長(zhǎng)度

        break;

        case 1: //掃描綠色

        //省略代碼

        break;

        case 2: //掃描藍(lán)色

        //省略代碼

        break;

        }

        }

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

        這下還沒完,我們發(fā)現(xiàn)每次掃描中都有延時(shí),延時(shí)過程中什么也不做,這是極大的浪費(fèi),我們需要再此改造,把延時(shí)去掉:


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

        關(guān)鍵詞:

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉