www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]最近剛把 DYS388 項目了結(jié),期間寫了不少程序,寫著寫著想到了一下東西,于是總結(jié)了一下。一、什么是占用式程序一個進(jìn)程在一個時刻只能處理一個任務(wù)。每個任務(wù)是為了完成一

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

一、什么是占用式程序

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

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

最常見的占用式程序結(jié)構(gòu)就是延時函數(shù)了,比如我最常用的5ms延時函數(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ù)。

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

void refresh7()

{

unsigned char r;

for(r=0;r<8;r++)< p="">

{

//掃描紅色

DPw = ~(0x01<<r); //修改完了再導(dǎo)通指定行

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

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

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

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

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

}

}

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

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

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

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

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

  三、對占用式程序的改造

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

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

void refresh7()

{

static unsigned char r=0;

//掃描紅色

DPw = ~(0x01<<r); //修改完了再導(dǎo)通指定行

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

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

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

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

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

r++;

if(r==8)

r=0;

}

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

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

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<<r); //修改完了再導(dǎo)通指定行

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

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

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

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

break;

case 1: //掃描綠色

//省略代碼

break;

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

//省略代碼

break;

}

}

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

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

void refresh7()

{

static unsigned char r=0;

static unsigned char flagrgb=0; //當(dāng)前需要點(diǎn)亮的顏色,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) //如果發(fā)現(xiàn)行都掃描結(jié)束則從第行開始掃描

r=0;

}

}

if(num<light7) //說明需要點(diǎn)亮

{

switch(flagrgb)

{

case 0: //掃描紅色

DPw = ~(0x01<

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

break;

case 1: //掃描綠色

DPw = ~(0x01<

DPg = ~vm7g[r];

break;

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

DPw = ~(0x01<

DPb = ~vm7b[r];

break;

}

}

else //說明不需要點(diǎn)亮

{

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

}

}

現(xiàn)在,這個函數(shù)中沒有任何延時和循環(huán),執(zhí)行所消耗的時間是非常少的,可以很快地響應(yīng)響應(yīng)其它任務(wù)。

四、改造的本質(zhì)

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

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

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

那為什么還要對其進(jìn)行改造呢,見下節(jié)分析。

五、非占用式程序結(jié)構(gòu)的優(yōu)勢

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

2、非占用式程序結(jié)構(gòu)可以放進(jìn)定時器

之前寫過一片《單片機(jī)用定時器分配任務(wù)程序結(jié)構(gòu)總結(jié)》已經(jīng)發(fā)現(xiàn)用定時器分配任務(wù)的好處,有些簡短的代碼可以直接放進(jìn)定時器里。

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

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

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

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

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

而改造之后的函數(shù),它的功能就是指定一下每個燈的亮滅,然后立馬退出,在執(zhí)行其它任務(wù)的過程中該點(diǎn)亮的燈是在點(diǎn)亮的狀態(tài)。這樣就提高了整體的亮度,在執(zhí)行其他任務(wù)的過程中,從某種意義上說也是在執(zhí)行當(dāng)前任務(wù)。

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

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

{

delay5(1);

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

{

//do something

}

}

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

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

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

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

{

//do something

}

keylast=key;

結(jié)合定時器進(jìn)行改造,是真的可以把占用式函數(shù)的延時時間節(jié)省出來的。

  六、非占用式程序的一般結(jié)構(gòu)

非占用式程序?qū)⒄加檬匠绦蚍指顖?zhí)行,需要用到靜態(tài)變量對當(dāng)前步驟進(jìn)行記憶,其一般結(jié)構(gòu)如下:

邏輯變量計算就是根據(jù)任務(wù)功能構(gòu)建出一個合理的邏輯結(jié)構(gòu)。

對邏輯變量的響應(yīng)就是對構(gòu)建好的邏輯結(jié)構(gòu)的結(jié)果的響應(yīng)和執(zhí)行。

  七、結(jié)論

最近開發(fā) DYS388 寫了不少程序,以前在寫程序的過程中就隱約發(fā)現(xiàn)了所謂占用式和非占用式程序結(jié)構(gòu)的區(qū)別,程序?qū)懚嗔丝隙馨l(fā)現(xiàn)問題,但是如果不停下來總結(jié),而是一味的開發(fā),那是不會有進(jìn)步的。

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

0次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉