zoukankan      html  css  js  c++  java
  • 树莓派高级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左右的延时,在编写程序时,应充分考虑这一点。若在时序里有复杂的代码段,则最好能实际测试一下,看看执行时间对我们的时序有什么影响。

  • 相关阅读:
    解析中间人攻击(4/4)---SSL欺骗
    解析中间人攻击(3/4)---会话劫持
    解析中间人攻击(2/4)---DNS欺骗
    解析中间人攻击(1/4)---ARP缓存中毒
    (转)常见的HTTPS攻击方法
    转载 OpenUrl
    如何安全的存储密码
    本地存储密码的安全设计
    硬件断点和软件断点的区别
    网站防止CC攻击的方法
  • 原文地址:https://www.cnblogs.com/yafengabc/p/5096445.html
Copyright © 2011-2022 走看看