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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機(jī)通過定時器來實現(xiàn)多任務(wù)

          單片機(jī)通過定時器來實現(xiàn)多任務(wù)

          作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          單片機(jī)系統(tǒng)中,有許多情況下需要等待某個事件的發(fā)生,來繼續(xù)下一步操作,如果有一個任務(wù)還好說,單片機(jī)可以無限等待事件的發(fā)生,但是如果單片機(jī)要處理多個事件時,這種系統(tǒng)一般不能實現(xiàn),除非用中斷,對!用中斷,但是中斷源的數(shù)量是有限的,并且有很多中斷源是針對特殊用處,這樣能給我自由分配的中斷源就只有定時器中斷和外部中斷,如果僅使用這幾個中斷源來實現(xiàn)異步,這樣可實現(xiàn)的異步事件時非常有限的,每個中斷源完成一個異步事件,效率是相當(dāng)?shù)停蟠蠼档土讼到y(tǒng)的性能,降低了定時器的利用率.

          因此在這里我考慮使用定時器中斷來實現(xiàn)多個事件的異步,一個定時器如何實現(xiàn)多個任務(wù)的并發(fā)?

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

          在這里使用一個任務(wù)一個計數(shù)器,根據(jù)任務(wù)實時性的強(qiáng)弱,來設(shè)計任務(wù)計數(shù)器的計數(shù)溢出值,每個任務(wù)的變量通過一個全局結(jié)構(gòu)體來定義,當(dāng)然這個結(jié)構(gòu)體必須包括這個計數(shù)溢出值。每到一個定時器中斷,各個任務(wù)計數(shù)器都加一,然后檢查計數(shù)器是否溢出,如果計數(shù)溢出就執(zhí)行相應(yīng)的任務(wù),同時將此任務(wù)的計數(shù)器值清零,,如果溢出執(zhí)行相應(yīng)的任務(wù),如果沒有,則此任務(wù)就不執(zhí)行!但一定要注意在中斷程序,千萬不能有死循環(huán),如果有等待一定要進(jìn)行超時檢測,來避免死機(jī)!

          這里舉個例子,剛剛成思路,因此寫的不是很好!這個程序使用一個4連體數(shù)碼管顯示從DS18B20中采集的溫度值,4位連體數(shù)碼管當(dāng)然只能使用動態(tài)掃描方法來顯示數(shù)據(jù),并且這個動態(tài)掃描不能在主程序中執(zhí)行,因為在主程序動態(tài)掃描效果很容易收到中斷程序的影響,而使顯示效果下降,因此必須使用定時器來控制延時實現(xiàn)動態(tài)掃描,但是ds18b20的讀寫時序?qū)ρ訒r的精度要求也是相當(dāng)高的,如果在主程序中,中斷程序造成的延時必然會對ds18b20采集數(shù)據(jù)的延時精確度造成干擾,而不能采集正確的數(shù)據(jù)!因此DS18b20采集數(shù)據(jù)的程序也不能夠放在主程序中,當(dāng)然我們可以使用兩個定時器來實現(xiàn)!這里我們使用一個定時器來實現(xiàn),由于DS18B20溫度轉(zhuǎn)換時間比較長12位精度的溫度轉(zhuǎn)換需要接近1秒的時間,這對動態(tài)掃描是無法容忍的,可行的辦法是將啟動轉(zhuǎn)換,讀取溫度值放在同一個中斷的不同狀態(tài),也就是在任務(wù)中實現(xiàn)狀態(tài)機(jī),從而避免了在中斷中出現(xiàn)長時間的等待,而影響系統(tǒng)的性能!以下中斷函數(shù)的具體實現(xiàn):

          void interrupt main_int()
          {
          //t0_int(&data) ;
          uchar tl ,th ;
          uint temp ;
          if(T0IF)
          {
          T0IF=0 ;
          (ds.count)++ ;
          if(ds.count==80)
          {
          ds.count=0 ;
          switch(ds.state)
          {
          case 0 :
          ds.state=1 ;
          init_ds18b20() ;
          write_ds18b20(ROM_SKIP) ;
          write_ds18b20(MEM_CONVERT) ;
          break ;
          case 1 :
          init_ds18b20() ;
          write_ds18b20(ROM_SKIP) ;
          write_ds18b20(MEM_READ) ;
          tl=read_ds18b20() ;
          th=read_ds18b20() ;
          if(!(th&0xf0))
          {
          th=th&0x07 ;
          temp=th*256+tl ;
          ds.data=temp/16 ;
          }
          else
          {th=th&0x07 ;
          temp=th*256+tl ;
          ds.data=temp/16 ;
          }
          ds.state=0 ;
          break ;
          default :
          ds.state=0 ;
          break ;
          }
          }
          int_display1(ds.data) ;
          TMR0=210 ;
          }
          }



          關(guān)鍵詞: 單片機(jī)定時器多任

          評論


          技術(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); })();