日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

一、什么是占用式程序

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

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

最常見(jiàn)的占用式程序結(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功能過(guò)程中是一直占用調(diào)用它的進(jìn)程處理資源的,在此期間不能進(jìn)行其它任務(wù)。

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

void refresh7()

{

unsigned char r;

for(r=0;r<8;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來(lái)記憶行數(shù),這樣每次調(diào)用此函數(shù)只需掃描一行,執(zhí)行速度是原來(lái)的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) //說(shuō)明三種顏色都掃描完了

{

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

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

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

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。

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

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) //說(shuō)明三種顏色都掃描完了

{

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

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

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

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: //掃描藍(lán)色

DPw = ~(0x01<

DPb = ~vm7b[r];

break;

}

}

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

{

DPw=0xff;

DPr=0xff;

DPg=0xff;

DPb=0xff;

}

}

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

四、改造的本質(zhì)

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

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

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

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

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

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

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

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

在改造之前的掃描程序是不適合放在定時(shí)器中斷處理程序里執(zhí)行的,因?yàn)樘L(zhǎng),可能還沒(méi)執(zhí)行完就來(lái)了下一個(gè)中斷。就算勉強(qiáng)執(zhí)行完了,留給主進(jìn)程處理其它事情的時(shí)間也不多了。

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

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

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

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

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

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

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

{

delay5(1);

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

{

//do something

}

}

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

通過(guò)對(duì)它改造之后,結(jié)合定時(shí)器,可以幾乎完全地把這5ms時(shí)間省出來(lái):

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

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

{

//do something

}

keylast=key;

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

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

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

 

 

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

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

七、結(jié)論

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

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

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

柏林2025年9月4日 /美通社/ -- 全球消費(fèi)電子與家電領(lǐng)先品牌海信,將以AI Your Life為主題在IFA 2025呈現(xiàn)全線人工智能創(chuàng)新成果。從沉浸式娛樂(lè)、影院級(jí)畫(huà)質(zhì)到智能家居生活與氣候智能健康,海信將展示AI...

關(guān)鍵字: 海信 AI RGB MINILED

阿聯(lián)酋迪拜2025年8月26日 /美通社/ -- 納斯達(dá)克上市公司Robo.ai Inc.今日正式宣布完成品牌煥新升級(jí),并于8月26日正式啟用全新納斯達(dá)克股票代碼"...

關(guān)鍵字: AI 人工智能 代碼 智能科技

北京2025年8月13日 /美通社/ -- 近日,北京積算科技有限公司(以下簡(jiǎn)稱(chēng)"積算科技")推出一站式AlphaFold3在線算力服務(wù),現(xiàn)已開(kāi)放免費(fèi)使用。其內(nèi)置優(yōu)化后的AlphaFold3模型,支持...

關(guān)鍵字: ALPHA 代碼 圖形化 蛋白質(zhì)

北京2025年7月21日 /美通社/ -- 浪潮信息宣布元腦企智一體機(jī)已率先完成對(duì)Kimi K2 萬(wàn)億參數(shù)大模型的適配支持,并實(shí)現(xiàn)單用戶70 tokens/s的流暢輸出速度,為企業(yè)客戶高效部署應(yīng)用大模型提供高處...

關(guān)鍵字: 模型 AGENT TOKEN 代碼

7月18日,一則“微信安卓安裝包出現(xiàn)5處fxxk”的話題,迅速登上微博熱搜,吸引了眾多網(wǎng)友的熱議和關(guān)注。

關(guān)鍵字: 代碼 程序員

共鑒AI未來(lái),緬懷先輩貢獻(xiàn) 深圳 2025年5月21日 /美通社/ -- 5月16日下午,深圳市金澄智創(chuàng)AI+傳承迎來(lái)了喬遷之喜,一場(chǎng)意義非凡的活動(dòng)在新址盛大舉行?;顒?dòng)現(xiàn)場(chǎng)星光熠熠,莊世平前輩之子莊榮新先生、南方財(cái)經(jīng)...

關(guān)鍵字: AI AI技術(shù) BSP 代碼

在基本RGB教程的基礎(chǔ)上,讓我們通過(guò)使用Adafruit NeoPixel庫(kù)和Mercury Board潛入顏色混合,將RGB LED控制提升到一個(gè)新的水平。而不是顯示靜態(tài)的紅色,綠色和藍(lán)色的光,我們將混合這些基本色以不...

關(guān)鍵字: RGB LED Adafruit NeoPixel庫(kù)

C語(yǔ)言代碼優(yōu)化與性能提升是軟件開(kāi)發(fā)中至關(guān)重要的一環(huán)。優(yōu)化C語(yǔ)言代碼不僅可以提高程序的執(zhí)行效率,還可以減少資源消耗,提升用戶體驗(yàn)。

關(guān)鍵字: C語(yǔ)言 代碼

Qt 路線圖致力于實(shí)現(xiàn)與各行業(yè)技術(shù)棧的無(wú)縫集成,助力企業(yè)與開(kāi)發(fā)者使用自選工具,更高效地構(gòu)建、擴(kuò)展和維護(hù)軟件解決方案。 芬蘭埃斯波 2025年5月7日 /美通社/ -- 在今日舉行的2025年Qt全球峰會(huì)上,Qt...

關(guān)鍵字: GROUP 生態(tài)系統(tǒng) 開(kāi)發(fā)者 代碼

——首批"專(zhuān)家級(jí)數(shù)字員工"部署上崗,構(gòu)建組織傳承與人才戰(zhàn)略的AI導(dǎo)師矩陣 北京2025年4月25日 /美通社/ -- 在生成式AI技術(shù)加速重構(gòu)組織能力與人才機(jī)制的當(dāng)下,如何留住專(zhuān)家經(jīng)驗(yàn)、培養(yǎng)管理人才...

關(guān)鍵字: AI 智能體 矩陣 代碼
關(guān)閉