新聞中心

        EEPW首頁 > 電源與新能源 > 設計應用 > 高效使用單片機放棄程序中延時函數

        高效使用單片機放棄程序中延時函數

        作者: 時間:2014-01-16 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/226910.htm

        試想,如果PC機CPU空轉一秒,那么音樂會斷一秒、畫面會停頓一秒、下載文件會斷一秒,這怎么可行?

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

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

        而我看到論壇里下到的絕大多數程序,兩個之間代碼的執行時間要遠遠小于8000個指令周期。

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

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

        要說怎么解決問題,就要先找到問題,我問問大家,程序中,我們為什么延時?

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

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

        所以說這些延時應該是很有道理的,我不否定這一點,但問題的關鍵這些延時空轉,我們為什么不能把這些時間回收起來做一些別的事呢?

        試想,如果把這99.9%的時間回收,那可以一筆相當巨大的資源。

        有很多人有些特殊方法回收過這些空轉時間,比如說在中做點事。

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

        1、前后臺模式下延時時間回收的方法:

        前后臺模式就是大家最常用的主程序大循環 + 中斷的模式。

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

        還有像LCD,我們一個個往顯存中寫數據是很浪費的,也應該建立緩沖,統一處理。

        建立緩沖區這類方式中間有一些技術難點,比如像串口接收,無法判斷對發是否全部發完,怎么辦?可以設立定時,如果一個字節接收之后1ms之內沒收到下一個,則認為接收完畢。這只是一個思想,具體應用大家掌握。

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

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

        可能又有些人會說,書里、教程都說了,中斷處理東西的時間要盡量短,你這樣整個中斷有太多判斷、很長,時間很長,這不行。

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

        void (*Task)(void);

        ISR

        {

        (*Task)(void);

        }

        中斷里用的內容通過函數指針來調用,這樣可以在主程序根據需要時任意改變要執行的任務,還可以改任務的周期。所用的判斷都是在主程序需中執行,然后改變指針的指向,來確定中斷中下一步的任務。


        上一頁 1 2 下一頁

        關鍵詞: 單片機 延時函數

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 琼中| 浮梁县| 新营市| 阳泉市| 海城市| 玛纳斯县| 迁安市| 永城市| 游戏| 酉阳| 亚东县| 高台县| 阿坝| 南宫市| 扶余县| 巴林右旗| 淮安市| 长海县| 冀州市| 莎车县| 增城市| 富阳市| 鄂托克前旗| 安丘市| 阿拉善盟| 论坛| 永兴县| 阿巴嘎旗| 贞丰县| 天台县| 平利县| 苏州市| 东兰县| 印江| 宁安市| 惠来县| 会昌县| 得荣县| 民乐县| 太仆寺旗| 许昌市|