<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201808/386850.htm

一、什么是占用式程序

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

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

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

void delay5(unsigned char n)

{

unsigned int i;

for(;n>0;n--)

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

}

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

還有一個(gè)很常見(jiàn)的占用式程序——數碼管掃描,不過(guò)在這里我不舉數碼管掃描的例子,而舉這次在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í)間長(cháng)度

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

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

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

}

}

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

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

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

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

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

三、對占用式程序的改造

在此以DYS388的掃描程序為例,對其進(jìn)行改造。

首先,每次調用就掃描8行,耗時(shí)太長(cháng),現將其改成每次掃描一行:

void refresh7()

{

static unsigned char r=0;

//掃描紅色

DPw = ~(0x01

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

DELAY7 (light7);//顯示時(shí)間長(cháng)度

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

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

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

r++;

if(r==8)

r=0;

}

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

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

void refresh7()

{

static unsigned char r=0;

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

flagrgb++;

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

{

flagrgb=0; //從紅色開(kāi)始掃描

r++; //開(kāi)始掃描下一行

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

r=0;

}

switch(flagrgb)

{

case 0: //掃描紅色

DPw = ~(0x01

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

DELAY7 (light7);//顯示時(shí)間長(cháng)度

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

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

break;

case 1: //掃描綠色

//省略代碼

break;

case 2: //掃描藍色

//省略代碼

break;

}

}

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

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


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

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>