當前位置:首頁 > 消費電子 > 消費電子
[導讀]最近剛把 DYS388 項目了結,期間寫了不少程序,寫著寫著想到了一下東西,于是總結了一下。一、什么是占用式程序一個進程在一個時刻只能處理一個任務。每個任務是為了完成一

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

一、什么是占用式程序

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

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

最常見的占用式程序結構就是延時函數了,比如我最常用的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;r<8;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循環(huán)8次代表屏幕的8個行;在每次循環(huán)里,先導通對應的行和需點亮的燈,然后延時light7個單位,再關閉所有顯示,再延時32-light7個單位。

二、占用式程序的缺點

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

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

三、對占用式程序的改造

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

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

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;

}

用一個靜態(tài)變量r來記憶行數,這樣每次調用此函數只需掃描一行,執(zhí)行速度是原來的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) //如果發(fā)現(xiàn)行都掃描結束則從第行開始掃描

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;

}

}

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

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

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) //如果發(fā)現(xiàn)行都掃描結束則從第行開始掃描

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;

}

}

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

四、改造的本質

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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;

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

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

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

 

 

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

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

七、結論

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

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

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉