學過單片機的同學應該清楚,我們在編寫感測器驅動時,需要用到高精度的定時器、延時等功能,wiringpi提供了一組函數來實現這些功能,這些函數分別是:micros() #返回當前的微秒數,這個數在調用wiringPiSetup()後被清零並重新計時millis() #返回當前的毫秒數,同上,這個數在調...
學過單片機的同學應該清楚,我們在編寫感測器驅動時,需要用到高精度的定時器、延時等功能,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左右的延時,在編寫程式時,應充分考慮這一點。若在時序里有複雜的代碼段,則最好能實際測試一下,看看執行時間對我們的時序有什麼影響。