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

          新聞中心

          EEPW首頁(yè) > 電源與新能源 > 設(shè)計(jì)應(yīng)用 > 高效使用單片機(jī)放棄程序中延時(shí)函數(shù)

          高效使用單片機(jī)放棄程序中延時(shí)函數(shù)

          作者: 時(shí)間:2014-01-16 來源:網(wǎng)絡(luò) 收藏

          第一次看到教程里Delay()函數(shù)的代碼時(shí)我嚇了一跳,竟然讓空轉(zhuǎn)以實(shí)現(xiàn)和外界同步,這怎么可能?

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

          試想,如果PC機(jī)CPU空轉(zhuǎn)一秒,那么音樂會(huì)斷一秒、畫面會(huì)停頓一秒、下載文件會(huì)斷一秒,這怎么可行?

          我看到很多程序,它們的99.9%的工作時(shí)間都在打空轉(zhuǎn),99.9%大家可能感到有些危言聳聽,那就讓我們算一算:

          已內(nèi)部8M頻的AVR單片機(jī)來說,單指令周期僅為1/8 = 0.125us,那一毫秒可以執(zhí)行多少個(gè)單周期指令? 1%0.125*1000 = 8000個(gè)

          而我看到論壇里下到的絕大多數(shù)程序,兩個(gè)之間代碼的執(zhí)行時(shí)間要遠(yuǎn)遠(yuǎn)小于8000個(gè)指令周期。

          說實(shí)話,很多16K以上的程序,把所有去掉,總體能執(zhí)行幾毫秒就不錯(cuò)了。

          換句話說,我說單片機(jī)的利用率小于0.01%還是口下留情了。

          要說怎么解決問題,就要先找到問題,我問問大家,程序中,我們?yōu)槭裁囱訒r(shí)?

          原因很多,可能是外設(shè)速度太慢,也可能是為了躲過人眼視覺停留時(shí)間,等等。

          總之就是與外界不同步,而我們想要同步。

          所以說這些延時(shí)應(yīng)該是很有道理的,我不否定這一點(diǎn),但問題的關(guān)鍵這些延時(shí)空轉(zhuǎn),我們?yōu)槭裁床荒馨堰@些時(shí)間回收起來做一些別的事呢?

          試想,如果把這99.9%的時(shí)間回收,那可以一筆相當(dāng)巨大的資源。

          有很多人有些特殊方法回收過這些空轉(zhuǎn)時(shí)間,比如說在中做點(diǎn)事。

          但這些往往都不通用,下面我說一些我的兩種方法:

          1、前后臺(tái)模式下延時(shí)時(shí)間回收的方法:

          前后臺(tái)模式就是大家最常用的主程序大循環(huán) + 中斷的模式。

          首先解決外設(shè)太慢問題,像串口、鍵盤、LCD、SD卡等IO,這些收發(fā)可以建立外部緩沖區(qū)。比如串口收發(fā)在中斷中完成保存到緩沖區(qū),而主程序操作緩沖區(qū)而不直接操縱串口,這已經(jīng)看到很多人這樣用了。但像矩陣鍵盤的緩沖區(qū),我很少看到有人這么用,在中斷中接收按鍵信息保存到緩沖區(qū)。

          還有像LCD,我們一個(gè)個(gè)往顯存中寫數(shù)據(jù)是很浪費(fèi)的,也應(yīng)該建立緩沖,統(tǒng)一處理。

          建立緩沖區(qū)這類方式中間有一些技術(shù)難點(diǎn),比如像串口接收,無(wú)法判斷對(duì)發(fā)是否全部發(fā)完,怎么辦?可以設(shè)立定時(shí),如果一個(gè)字節(jié)接收之后1ms之內(nèi)沒收到下一個(gè),則認(rèn)為接收完畢。這只是一個(gè)思想,具體應(yīng)用大家掌握。

          可能有人會(huì)說,除了外設(shè)太慢,還有像視覺停留的問題怎么解決,總不能讓流水燈快到人眼都看不清吧。

          這就我下面要說的問題,這些延時(shí)的時(shí)間怎么回收?就是全部放到定時(shí)中斷中!

          可能又有些人會(huì)說,書里、教程都說了,中斷處理東西的時(shí)間要盡量短,你這樣整個(gè)中斷有太多判斷、很長(zhǎng),時(shí)間很長(zhǎng),這不行。

          這是一種教條的思想,把書讀死了。可以在中斷中這樣處理,比如:

          void (*Task)(void);

          ISR

          {

          (*Task)(void);

          }

          中斷里用的內(nèi)容通過函數(shù)指針來調(diào)用,這樣可以在主程序根據(jù)需要時(shí)任意改變要執(zhí)行的任務(wù),還可以改任務(wù)的周期。所用的判斷都是在主程序需中執(zhí)行,然后改變指針的指向,來確定中斷中下一步的任務(wù)。


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

          關(guān)鍵詞: 單片機(jī) 延時(shí)函數(shù)

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