久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

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

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年10月08日   【字體:

  我是PC機(jī)底層編程轉(zhuǎn)過(guò)來(lái)的,以前從來(lái)沒(méi)接觸過(guò)單片機(jī),五個(gè)月前學(xué)習(xí)AVR,在這里學(xué)到很多東西。但也意識(shí)到電子工程師們的硬件編程思想與PC機(jī)底層編程思想上的很多不同,引發(fā)了一些思考。我說(shuō)一說(shuō),供大家參考,只為學(xué)習(xí),無(wú)意爭(zhēng)論。

  我第一次看到教程里Delay()函數(shù)的代碼時(shí)我嚇了一跳,竟然讓單片機(jī)空轉(zhuǎn)以實(shí)現(xiàn)和外界同步,這怎么可能?
試想,如果PC機(jī)CPU空轉(zhuǎn)一秒,那么音樂(lè)會(huì)斷一秒、畫(huà)面會(huì)停頓一秒、下載文件會(huì)斷一秒,這怎么可行?

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

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

  而我看到論壇里下到的絕大多數(shù)程序,兩個(gè)延時(shí)函數(shù)之間代碼的執(zhí)行時(shí)間要遠(yuǎn)遠(yuǎn)小于8000個(gè)指令周期。
說(shuō)實(shí)話,很多16K以上的程序,把所有延時(shí)函數(shù)去掉,總體能執(zhí)行幾毫秒就不錯(cuò)了。

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

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

  原因很多,可能是外設(shè)速度太慢,也可能是為了躲過(guò)人眼視覺(jué)停留時(shí)間,等等。
總之就是與外界不同步,而我們想要同步。

  所以說(shuō)這些延時(shí)應(yīng)該是很有道理的,我不否定這一點(diǎn),但問(wèn)題的關(guān)鍵這些延時(shí)空轉(zhuǎn),我們?yōu)槭裁床荒馨堰@些時(shí)間回收起來(lái)做一些別的事呢?
試想,如果把這99.9%的時(shí)間回收,那可以一筆相當(dāng)巨大的資源。

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

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


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

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

  首先解決外設(shè)太慢問(wèn)題,像串口、鍵盤(pán)、LCD、SD卡等IO,這些收發(fā)可以建立外部緩沖區(qū)。比如串口收發(fā)在中斷中完成保存到緩沖區(qū),而主程序操作緩沖區(qū)而不直接操縱串口,這已經(jīng)看到很多人這樣用了。但像矩陣鍵盤(pán)的緩沖區(qū),我很少看到有人這么用,在中斷中接收按鍵信息保存到緩沖區(qū)。
還有像LCD,我們一個(gè)個(gè)往顯存中寫(xiě)數(shù)據(jù)是很浪費(fèi)的,也應(yīng)該建立緩沖,統(tǒng)一處理。

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

  可能有人會(huì)說(shuō),除了外設(shè)太慢,還有像視覺(jué)停留的問(wèn)題怎么解決,總不能讓流水燈快到人眼都看不清吧。
這就我下面要說(shuō)的問(wèn)題,這些延時(shí)的時(shí)間怎么回收?就是全部放到定時(shí)中斷中!

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

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

void (*Task)(void);
ISR
{
      (*Task)(void);
}

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

  這樣,在前后臺(tái)系統(tǒng)中主程序?qū)⑷蝿?wù)分配完,還有很多余力處理很多事。

  比如有很多個(gè)鍵盤(pán)、LED點(diǎn)陣、數(shù)碼管等,它們都需要實(shí)時(shí)響應(yīng),很容造成編程困難、響應(yīng)遲鈍,其實(shí)只要把延時(shí)的時(shí)間回收,處理這些就非常從容了。

  可能還有人會(huì)說(shuō),有些項(xiàng)目用不了這么苛刻的時(shí)間,你回收的時(shí)間用不了,要那么多干嘛?

  其實(shí)這時(shí),你就可以用死循環(huán)掃描事件,可以實(shí)時(shí)響應(yīng)。你的系統(tǒng)跟原來(lái)空循環(huán)延時(shí)比,實(shí)時(shí)性要高了不知多少倍。


2、變異的協(xié)作式內(nèi)核

  先說(shuō)說(shuō)嵌入式操作系統(tǒng)的內(nèi)核,簡(jiǎn)單的說(shuō),它就是個(gè)任務(wù)調(diào)度器,讓多個(gè)任務(wù)在同一個(gè)CPU上同時(shí)執(zhí)行,所謂同時(shí)也是相對(duì)的,無(wú)非就第一個(gè)任務(wù)執(zhí)行幾毫秒、第二個(gè)任務(wù)在執(zhí)行幾毫秒。。。外表看起來(lái)就是同時(shí)執(zhí)行。

  至于可剝奪式內(nèi)核和協(xié)作式內(nèi)核的區(qū)別,大家可以百度一下。

  說(shuō)道能在單片機(jī)上用的嵌入式操作系統(tǒng),大家會(huì)說(shuō)出一些如uCosII、FreeOS等操作系統(tǒng)。
還有很多人對(duì)這些操作系統(tǒng)十分抗拒、十分反對(duì),他們的理由是什么?

1、這些操作系統(tǒng)占用大量RAM、ROM
2、這些實(shí)時(shí)操作系統(tǒng)所謂的實(shí)時(shí)是相對(duì)非實(shí)時(shí)操作系統(tǒng)的,跟裸機(jī)比實(shí)際上是慢了

  這些理由不是沒(méi)道理,因?yàn)檫@些商用操作系統(tǒng)都是可剝奪式內(nèi)核,它們的原則是保證最高優(yōu)先級(jí)任務(wù)在可確定的時(shí)間內(nèi)響應(yīng)。
它們的有優(yōu)點(diǎn)是任務(wù)切換時(shí)間是確定的,不會(huì)隨任務(wù)的多少而改變。
有了這些確定性,讓它們?cè)谏逃卯a(chǎn)品大放光彩。因?yàn)槠鋾r(shí)間穩(wěn)定性。

  但它們的缺點(diǎn)也很明顯,中斷級(jí)節(jié)拍浪費(fèi)很多時(shí)間。任務(wù)間同時(shí)調(diào)用時(shí)引發(fā)同步問(wèn)題而引入許多如信號(hào)量、郵箱等機(jī)制浪費(fèi)大量RAM、ROM。

  綜上,可剝奪式內(nèi)核穩(wěn)定可定量,在越高級(jí)的單片機(jī)上越有優(yōu)勢(shì),在8位機(jī)上可用,但需要大量裁剪,并不一定合適。

而協(xié)作式內(nèi)核的核心思想是什么?它不像剝奪式內(nèi)核保證最高級(jí)任務(wù)速度最快,而是保證所有任務(wù)的平均速度最快!

 正如我前面的說(shuō)法,我連續(xù)兩個(gè)延時(shí)函數(shù)之間的代碼很難超過(guò)1ms,甚至很難超過(guò)100us,我們可以將其忽略。這樣10個(gè)任務(wù),第一個(gè)執(zhí)行完主動(dòng)放棄單片機(jī)控制權(quán),交給第二個(gè)任務(wù),第二個(gè)任務(wù)執(zhí)行完主動(dòng)放棄控制權(quán),交給第三個(gè)任務(wù)。10個(gè)任務(wù)之間無(wú)間隙,每一個(gè)任務(wù)需要延時(shí)時(shí),就主動(dòng)放棄控制權(quán)。

 基于這種思想,我們的就達(dá)到了回收空轉(zhuǎn)延時(shí)的目的,而且應(yīng)為每個(gè)任務(wù)是執(zhí)行完后主動(dòng)放棄,所以不存在剝奪式內(nèi)核的同步問(wèn)題,基本不需要郵箱、信號(hào)量等機(jī)制,對(duì)RAM、ROM的要求就非常低了。

 這樣來(lái)看,協(xié)作式內(nèi)核非常適合8位機(jī)。但可能有太多嵌入式系統(tǒng)的書(shū)中對(duì)剝奪式內(nèi)核不分場(chǎng)合的認(rèn)可,造成很多人誤解。而且uCos等系統(tǒng)的權(quán)威,也讓很多RTOS作者爭(zhēng)相效仿,沒(méi)用對(duì)8位機(jī)的場(chǎng)合做合理分析。

 商用系統(tǒng)中沒(méi)有協(xié)作式內(nèi)核,而民用的,還少有優(yōu)秀的協(xié)作式內(nèi)核,都是基于傳統(tǒng)節(jié)拍。

 傳統(tǒng)協(xié)作式內(nèi)核需要定時(shí)中斷為時(shí)鐘基準(zhǔn),也會(huì)間歇性打斷任務(wù),造成不必要的損失,這并不是我們想要的。

 我們其實(shí)可以僅僅是讓定時(shí)器以大分頻系數(shù)開(kāi)著, 而不給其產(chǎn)生中斷的機(jī)會(huì)。當(dāng)任務(wù)將要放棄使用權(quán)時(shí),讀取定時(shí)器,作為時(shí)鐘基準(zhǔn),然后清零。

 做法一句兩句說(shuō)不清,而效果是什么?可以做到任務(wù)是以不受干擾,與裸機(jī)相同的工作狀態(tài),這是傳統(tǒng)協(xié)作式內(nèi)核做不到的,而僅當(dāng)它需要延時(shí)了,才放棄使用權(quán),將延時(shí)的時(shí)間給其它任務(wù)。這正符合我全文的目的 -- 回收空轉(zhuǎn)延時(shí)時(shí)間

 這樣的內(nèi)核體積會(huì)非常小,運(yùn)行方式與裸機(jī)無(wú)異,僅僅是把空轉(zhuǎn)延時(shí)時(shí)間干些其它事。對(duì)使用者還沒(méi)什么要求,不想以往系統(tǒng)那么復(fù)雜。

 可惜市面上并沒(méi)有基于這種方式的內(nèi)核,我已經(jīng)寫(xiě)了一個(gè),非常精簡(jiǎn),運(yùn)行穩(wěn)定。但作為一個(gè)想應(yīng)用實(shí)際的內(nèi)核,還需要檢驗(yàn)。我最后檢查一下后,過(guò)幾天拿出來(lái)大家一起分享。

 PS:好了,我上面兩種方式,均為原創(chuàng)。希望能對(duì)大家有幫助~ 第二種中介紹的變異協(xié)作式內(nèi)核思想很簡(jiǎn)單,有興趣可以自己寫(xiě)一個(gè),我過(guò)幾天會(huì)把我的發(fā)上來(lái)。

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产最新网址 | 在线看av的网址 | 亚洲高清久久 | 成人在线 | 亚洲欧洲日韩精品 中文字幕 | www.成人.com| 国产欧美一区二区三区久久人妖 | 国产成人精品a视频 | 国产色网| 国产偷录视频叫床高潮对白 | 红桃视频一区二区三区免费 | 青青久久久 | 国产高清一区二区三区 | 欧美一级欧美三级在线观看 | 艹逼网 | 91精品国产手机 | 精品国产一区二区三区久久久久久 | 国产欧美一区二区三区在线看蜜臀 | 国产精品美女久久久久久免费 | 亚洲免费av一区 | 91资源在线观看 | 国产片侵犯亲女视频播放 | 九色网址| 欧美中文字幕一区二区三区 | 亚洲在线视频 | 国产精品久久久久久亚洲调教 | 天天综合久久 | 国产欧美一区二区三区久久人妖 | 成人久久18免费 | 日本午夜免费福利视频 | 粉嫩国产精品一区二区在线观看 | 蜜桃毛片| 91免费看片 | 国产传媒在线观看 | 久久久夜夜夜 | 中文字幕伊人 | 观看av| 亚洲免费在线观看 | 成人午夜视频在线观看 | 91亚洲欧美 | 久久久久国产精品一区二区 |