樹莓派高級GPIO庫,wiringpi2 for python使用筆記(二)高精度計時、延時函數


學過單片機的同學應該清楚,我們在編寫傳感器驅動時,需要用到高精度的定時器、延時等功能,wiringpi提供了一組函數來實現這些功能,這些函數分別是:

micros() #返回當前的微秒數,這個數在調用wiringPiSetup()后被清零並重新計時

millis() #返回當前的毫秒數,同上,這個數在調用wiringPiSetup()后被清零並重新計時

delayMicroseconds() #高精度微秒延時

delay() #毫秒延時。

python相對於C,一個很大的問題就是執行速度慢,所以指令執行速度不可忽視,我們可以用micos函數來檢測指令執行時間,用來避免實際使用中遇到的坑,請看以下代碼:

import wiringpi2 as gpio

for i in range(5):
    t1=gpio.micros()
    t2=gpio.micros()
    print(t2-t1)

連續調用兩次micros,然后打印出差值,運行結果如下:

[root@RasPi ~/testcode]# python testus.py
12
4
4
5
5

我們看到第一次的結果明顯比以后的結果要大,多了接近10微秒,一般的程序來說,這無關緊要,要是要求更高,可以把代碼改成這個樣子:

import wiringpi2 as gpio

for i in range(5):
    t1=gpio.micros()
    t1=gpio.micros()
    t2=gpio.micros()
    print(t2-t1)

運行結果如下:

[root@RasPi ~/testcode]# python testus.py
3
3
3
3
2

基本一致了再看以下代碼:

import wiringpi2 as gpio

for i in range(5):
    t1=gpio.micros()
    t1=gpio.micros()
    gpio.delayMicroseconds(10)
    t2=gpio.micros()
    print(t2-t1)

延時10us,結果如下:

[root@RasPi ~/testcode]# python testus.py
21
21
18
18
18

減去兩次調用micros()之間的5us左右的延時,實際延時10us會有5us左右的延時。

import wiringpi2 as gpio

for i in range(5):
    t1=gpio.micros()
    t1=gpio.micros()
    for i in range(100):
        pass
    t2=gpio.micros()
    print(t2-t1)

結果:

[root@RasPi ~/testcode]# python testus.py
59
69
66
61
62

也就是,普通幾條指令,每條延時在1us以下,可以基本忽略,調用函數,則有5-10us左右的延時,在編寫程序時,應充分考慮這一點。若在時序里有復雜的代碼段,則最好能實際測試一下,看看執行時間對我們的時序有什么影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM