1. 程式人生 > >Avr-Gcc中關於delay函式的應用

Avr-Gcc中關於delay函式的應用

在util資料夾中找到delay標頭檔案如下:
void
_delay_ms(double __ms)
{
    uint16_t __ticks;
    double __tmp = ((F_CPU) / 4e3) * __ms;
    if (__tmp < 1.0)
        __ticks = 1;
    else if (__tmp > 65535)
    {
        //    __ticks = requested delay in 1/10 ms
        __ticks = (uint16_t) (__ms * 10.0);
        while(__ticks)
        {
            // wait 1/10 ms
            _delay_loop_2(((F_CPU) / 4e3) / 10);
            __ticks --;
        }
        return;
    }
    else
        __ticks = (uint16_t)__tmp;
    _delay_loop_2(__ticks);
}
/****************************************************************************************/
void
_delay_us(double __us)
{
    uint8_t __ticks;
    double __tmp = ((F_CPU) / 3e6) * __us;
    if (__tmp < 1.0)
        __ticks = 1;
    else if (__tmp > 255)
    {
        _delay_ms(__us / 1000.0);
        return;
    }
    else
        __ticks = (uint8_t)__tmp;
    _delay_loop_1(__ticks);
}
分析程式發現上面兩個子函式,分別使用了 _delay_loop_1();和using_delay_loop2()
還是在util資料夾下開啟delay_basic.h檔案
/** \ingroup util_delay_basic

    Delay loop using an 8-bit counter \c __count, so up to 256
    iterations are possible.  (The value 256 would have to be passed
    as 0.)  The loop executes three CPU cycles per iteration, not
    including the overhead the compiler needs to setup the counter
    register.

    Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
    can be achieved.
*/

翻譯過來就是:
    迴圈變數為8位,所以可達256(其值256和0等同),每次迴圈好執行3個CPU時鐘,不包括程式呼叫和退出該函式所花費的時間。
    如此,當CPU為1MHZ時,最大延時為768us。( 3us*256)void
_delay_loop_1(uint8_t __count)
{
    __asm__ volatile (
        "1: dec %0" "\n\t"
        "brne 1b"
        : "=r" (__count)
        : "0" (__count)
    );
}

/******************************************************/
/** \ingroup util_delay_basic

    Delay loop using a 16-bit counter \c __count, so up to 65536
    iterations are possible.  (The value 65536 would have to be
    passed as 0.)  The loop executes four CPU cycles per iteration,
    not including the overhead the compiler requires to setup the
    counter register pair.

    Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
    milliseconds can be achieved.
 */

翻譯:
        迴圈變數為16位,所以可達65536(其值65536和0等同),每次迴圈好執行4個CPU時鐘,不包括程式呼叫和退出該函式所花費的時間。
    如此,當CPU為1MHZ時,最大延時大約為262.1us。( 4us*65536)void
_delay_loop_2(uint16_t __count)
{
    __asm__ volatile (
        "1: sbiw %0,1" "\n\t"
        "brne 1b"
        : "=w" (__count)
        : "0" (__count)
    );
}
/*************************************************************/

有了上面的基礎就不難得出
   #include <util/delay_basic.h>    // 標頭檔案
  
   // _delay_loop_1(XX);        //    8-bit count, 3 cycles/loop
   // _delay_loop_2(XXXX);      //   16-bit count, 4 cycles/loop

相關推薦

Avr-Gcc關於delay函式應用

在util資料夾中找到delay標頭檔案如下: void _delay_ms(double __ms) {     uint16_t __ticks;     double __tmp = ((F_CPU) / 4e3) * __ms;     if (__tmp < 1.0)         __ti

AVR delay 函式的呼叫注意事項!delay_ns delay_ms

AVR編譯器眾多,可謂是百家齊鳴,本人獨尊WinAVR. 說明:編譯器版本WinAVR-20080610 先說winAVR的_Delay.h_肯定是在Include資料夾下了,進去一看果然有,可開啟一看,其曰:“This file has been moved to <util/delay.h>

python函式應用

一、什麼是偏函式? (1)在Python的functools模組眾多的功能中,其中有一個就是偏函式,我們稱之為 partial function 模組的概念我們下一篇在細講。 (2)我們都聽過偏將軍吧,在三國時代的官制中,系將軍的輔佐,與裨將軍兩者都

ExcelIF函式的多條件判斷(巢狀),與LOOKUP函式的聯合應用

1、IF函式的多條件判斷 當IF函式要對多個條件進行判斷時,除了AND和OR函式(前面文章介紹),更多的情況需要用到IF函式的巢狀。 例如要對學生的分數進行評級,當分數小於60分時,不及格;分數大於等於60分小於70分時為及格,以此類推。 選擇單元格—輸入公式=IF(B2 2、LOOKUP函式基礎應用

pythonrandom的應用以及包含的函式,元后率的計算

#random庫的介紹 #為隨機數:採用梅森旋轉演算法生成的為隨機序列中的元素,random主要用於產生隨機數 ''' random包括8個函式: 基本函式:seed(),random() 擴充套件函式時:randint(),getrandbits(),uniform(),r

jQuerytoggle()函式應用總結(包含今天專案碰到的前端控制元件)

       本人是一名後臺開發人員,然而公司專案沒有做到前後端分離,前端僅僅是寫靜態頁面,js還得後臺開發人員寫。對於前端的東西呢常見東西的是沒有問題,但是有些東西用的少可能容易忘記。這不今天接手維護另一個同事的一個模組就被安排了。有問題怎麼辦?W3s!jquery語法上的

gcc std::list 的size()成員函式

#include <iostream> #include <fstream> #include <string> #include <vector> #include <iterator> #include <algorithm

PHP指令碼getopt函式應用

在php中,getopt函式用於接收cmd引數,使用php寫指令碼往往會用的到此函式。 例如,當在linux中用php呼叫時,往往需要帶引數呼叫。在php程式設計中使用getopt,即可實現帶引數傳入的命令。 比如寫一個指令碼,想查某一時間段內的資料: $opt = getopt("s:

MFC 基本的應用程式資訊和管理函式 ----- 全域性函式

AfxFreeLibrary  : 減少已調入記憶體的動態連結庫模組的引用計數,當引用計數減到0時,該模組就會被釋放 AfxGetApp  返回應用程式物件CWinApp 的一個指標 AfxGetAppName  返回應用程式的名稱 AfxGetIns

javascriptbind()函式實現和應用以及多次bind的結果和引數位置的思考

改變物件方法裡this的值var ob = { name: 'joe', getName: function () { alert(this.name); } }; // 改變getName方法裡原本的this物件為新物件{name: 'haha'} var app = ob.getName.bi

MATLAB sort函式應用——求一個矩陣前L個最大值及其在矩陣的位置

For vectors, sort(X) sorts the elements of X in ascending order. For matrices, sort(X) sorts each column of X in ascending order.For N-D

Delphi隨機函式Random應用兩則

1. 自動隨機出題   你也許有這樣的經歷:孩子剛上學,數學老師要你每天給出10或者20道算術題,作為你孩子的家庭作業, 你是否有點煩?彆著急,電腦可幫你忙! 在Delphi中,有一隨機函式,是這樣定義的: function Random [ ( Range: Int

ExcelHyperlink函式最強應用:批量插入超連結

原創文章,轉載或者分享,請註明來自  資料小兵  部落格   謝謝合作 前面介紹過一個姐妹篇:excel中如何批量提取超連結的連結地址便於統計 ,在實際應用當中發現還有反過來使用的需求,就是在excel中如何批量插入超連結地址,以本部落格為例,假設已經採集到文章標題和url地址,現在需要把標題和u

阿里前端測試題--關於ES6Promise函式的理解與應用

今天做了阿里前端的筆試題目,原題目是這樣的 //實現mergePromise函式,把傳進去的陣列順序先後執行,//並且把返回的資料先後放到陣列data中const timeout = ms => new Promise((resolve, reject) => {setTimeout(() =

ZF框架-phtml模板實現函式應用

專案目錄 \application\views\helpers 建立 Bbc.php 內容如下: <?php class Zend_View_Helper_Bbc { protected $_bbc; function __construct()

VBSSpace函式應用

昨天看動網分類的時候看到他們是這樣出的 <%if rs("depth")>0 then%><%for i=1 to rs("depth")%>  &nbsp;<%next%><%end if%> 所以今天寫個小文章

詳解應用層open函式如何呼叫到底層驅動xxx_open函式

在上一篇Linux驅動(三)字元裝置驅動框架中,我們編寫函式操作集合ops,並編寫了應用層程式碼。我們現在來看一看,程式如何從應用到達驅動層的。linux中一切皆檔案,核心如何來區別每一個檔案,這個叫做

MATLABnorm()函式應用

NORM   Matrix or vector norm.     For matrices...       NORM(X) is the largest singular value of X, max(svd(X)).       NORM(X,2) is the same as NORM(X).   

Dwarf2結構在gcc應用及調試器實現分析

格式 開始 ESS 數據結構 lar 生成 運行 堆棧 offset 一、查看方法。 通過gcc -S -g 生成的匯編代碼中包含了一些使用樹脂表示的調試信息,但是這些信息本身如果我們一個一個看文檔的話還是比較麻煩的,所以我們只有通過其它的方法來實現。還要readelf提

IOS公布應用程序,進度條一直不走怎麽處理

sso pan arch 技術分享 成功 csdn 版本 進度條 div 在IOS中公布應用程序非常是喜聞樂見。近期1周。我更新了6次版本號。可是時不時的會卡住,進度條不走。最後總結了幾個原因。 1.在公布前你要確認自己的證書是否配置正確 2.DNS域名server有沒