中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 嵌入式里的“延遲”

        嵌入式里的“延遲”

        作者:jobs 時間:2015-05-27 來源:電子產(chǎn)品世界 收藏

          前些天在版主群里有人問“有沒有好用的延遲函數(shù)啊?”我的第一反應就是“延遲函數(shù)要視自己的應用而編寫,不可能千篇一律的應用。”可是回首一看,單片機的發(fā)展歷程,在不同時期里有著不一樣的延遲函數(shù)。

        本文引用地址:http://www.antipu.com.cn/article/274824.htm

          在版主上學的年代里,單片機課程老師對匯編語言有著非常深入的了解,如XX指令是單指令周期,XX指令是雙指令周期。如果使用了編程,也要仔細看生成的匯編代碼然后再調(diào)節(jié)。例如下面的代碼示例:

          功能 延時(12M 24M)

          誤差 Ms S 5% 10Us 8%-80%

          //24M晶振 延時 n毫秒

          void DelayMs_24M(unsigned int n)

          {

          unsigned int i=0,j=0;

          for(i=0;i

          for(j=0;j<357;j++);

          }

          延遲函數(shù)是通過的兩個循環(huán)計算而形成的停機等待而達到延遲的目的。代碼是通過查看由生成的匯編代碼指令——那個357便是由此計算出來的。當然,延遲函數(shù)是否精準也完全取決于那個357數(shù)字的選擇了。

          單周期指令,雙周期指令,數(shù)一數(shù)便可以了?其實查看匯編代碼沒有這么簡單的,畢竟For循環(huán)也需要系統(tǒng)開銷的,還有其它比較,判斷指令什么的。但這一切在IAR for AVR編譯環(huán)境里似乎就簡單多了。

          在IAR for AVR編譯環(huán)境里,用戶只需要 #include "intrinsics.h"便可以調(diào)用void __delay_cycles(unsigned long);函數(shù),這個函數(shù)是系統(tǒng)函數(shù),其代表著一個機器周期。用戶不再需要計算匯編語言的指令周期,不必再細讀單片機的操作手冊,強大的IAR編譯環(huán)境自己就算好了——單片機發(fā)展到IAR for AVR時代,也基本代表著匯編退居二線。由于篇幅的原因,版主就不再這里為大家帖出代碼示例了。

          在Atmel的8位單片機AVR系列一統(tǒng)天下的時候,ARM內(nèi)核為代表的單片機在悄然崛起。不知不覺,以ST公司stm32f103為代表的32位Cortex-M3內(nèi)核的單片機占據(jù)了市場大部分分額,各大論壇爭先推出STM32版塊。

          其中,某位牛人推出的使用systick函數(shù)來完成延遲函數(shù)頗具人氣。我們來看一下源代碼:

          //初始化延遲函數(shù)

          void delay_init(u8 SYSCLK)

          {

          SysTick->CTRL&=0xfffffffb;//選擇內(nèi)部時鐘 HCLK/8

          fac_us=SYSCLK/8;

          fac_ms=(u16)fac_us*1000;

          }

          void delay_ms(u16 nms)

          {

          SysTick->LOAD=(u32)nms*fac_ms; //時間加載

          SysTick->CTRL|=0x01; //開始倒數(shù)

          while(!(SysTick->CTRL&(1<<16))); //等待時間到達

          SysTick->CTRL&=0XFFFFFFFE; //關閉計數(shù)器

          SysTick->VAL=0X00000000; //清空計數(shù)器

          }

          牛人的代碼還是非常簡潔的,使用起來也方便,首先調(diào)用delay_init函數(shù),然后,再調(diào)用delay_ms()函數(shù)。這個延遲函數(shù)也是非常準確的,因為其使用了單片機的硬件定時器模塊。在STM32F103高達72MHz的主頻,優(yōu)化的指令集系統(tǒng)下,系統(tǒng)的開銷完成可以忽略。筆者也將其成功應用于單總線通訊方式的數(shù)字溫度采集傳感器18B20芯片上,測試良好。

          寫到這里,筆者已經(jīng)介紹了三種延遲函數(shù),它們?nèi)齻€都有一個共同的特點:阻塞延遲函數(shù)——在“等待”延遲函數(shù)到來的時候里,單片機并沒有處理其它有用,有意義的事情,而是停機在等待著時間的到來。對于我們要處理大量數(shù)據(jù)的單片機系統(tǒng)來說,這個劣勢有時就很難接受的。那么我們要怎么解決呢?

          我們?nèi)匀灰許TM32F103為例,仍然要使用強大的定時器,這里我們再次選用systick定時器。我們首先要初始化ST單片機systick,其每1ms進入中斷一次,代碼如下:

          if (SysTick_Config(72000)) //參數(shù)為系統(tǒng)時鐘的向上溢出值,此配置為72000,即1ms中斷一次

          {

          /* Capture error */

          while (1);

          }

          之后,我們在systick的中斷函數(shù)里計數(shù),示例代碼如下:

          void SysTick_Handler(void)

          {

          if(gCntLed[0] > 0)

          {

          gCntLed[0]--;

          }

          else

          {

          gCntLed[0] = 0;

          }

          }

          從上面代碼可以清楚看到,每1ms,gCntLed[0]將計數(shù)值減1,直到為0時止。而main函數(shù)里,就要不斷的查詢這個gCntLed[0]的值,當未達到0值時,就去做別的事情,而查詢到0值時,再去處理自己的事情,示例代碼如下:

          while(1)

          {

          if(gCntLed[0] == 0)

          {

          LedToggle(0);

          gCntLed[0] = 200;

          }

          KeyScan();

          }

          通過未阻塞的延遲函數(shù),我們實現(xiàn)了LED燈每隔200ms閃爍一次的效果,與其同時,我們也沒有停止不斷掃描按鍵。——這就是非阻塞延遲函數(shù)的強大優(yōu)勢。非阻塞式延遲函數(shù)還主要應用于操作系統(tǒng)函數(shù)里,喜歡的網(wǎng)友可以自己查看相關函數(shù)。

          隨著時代的進步,能源的問題逐漸突出出來。剛剛筆者介紹的幾種函數(shù)都是在不停的“運行”,看似什么事情也沒有做,但是單片機確實在全力的“奔跑”,這與當前節(jié)碳減排,低功耗格格不入。MSP430算得上是低功耗的代表了,其延遲函數(shù)可以拿來借鑒一下。

          在MSP430的低功耗設計中,阻塞式延遲函數(shù)是基本不用的——因為功耗太大,未阻塞式延遲函數(shù)是必備條件。設計主要思想是,定時讓MSP430從睡眠模式里“醒”過來,查看一下當前的時間與狀態(tài),然后再做決定如何處理。換句話說,上面的示例就變成了,MSP430每1ms準時醒來一次,處理了一下gCntLed[0]的值,然后又查看了一下,如果非0值,則繼續(xù)“睡”去了;如果恰好是0值,則再干一會兒事情……這里,MSP430大部分時間里就處于了低功耗的睡眠模式,自然也就節(jié)能了。

          又到總結(jié)的時候了,幾種延遲函數(shù)各有特點與應用場景,各位親愛的網(wǎng)友們根據(jù)自己的需求來自行選擇吧!當然,也可以來論壇的ARM版塊發(fā)帖求助,版主也會傾力奉獻的。

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
        塵埃粒子計數(shù)器相關文章:塵埃粒子計數(shù)器原理
        晶振相關文章:晶振原理


        關鍵詞: 嵌入式 C語言

        評論


        相關推薦

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

        關閉