<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201808/386850.htm

          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

          {

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

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

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

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

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

          之前寫過一片《單片機(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),可能還沒執(zhí)行完就來了下一個(gè)中斷。就算勉強(qiáng)執(zhí)行完了,留給主進(jìn)程處理其它事情的時(shí)間也不多了。

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

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

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

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

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

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

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

          {

          delay5(1);

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

          {

          //do something

          }

          }

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

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

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

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

          {

          //do something

          }

          keylast=key;

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

          六、非占用式程序的一般結(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é)論

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

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


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

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();