gpt4 book ai didi

Python、Raspberry pi,每10毫秒精确调用一次任务

转载 作者:行者123 更新时间:2023-12-01 03:00:30 25 4
gpt4 key购买 nike

我目前正在尝试每 10 毫秒调用一个函数来从传感器获取数据。

基本上,我是从 gpio 中断触发回调,但我更改了传感器,而我当前使用的传感器没有 INT 引脚来驱动回调。

所以我的目标是具有相同的行为,但具有由计时器生成的内部中断。

我从这个topic尝试过这个

import threading

def work ():
threading.Timer(0.25, work).start ()
print(time.time())
print "stackoverflow"

work ()

但是当我运行它时,我可以看到计时器并不是非常精确,并且随着时间的推移它会出现偏差,正如您所看到的。

1494418413.1584847
stackoverflow
1494418413.1686869
stackoverflow
1494418413.1788757
stackoverflow
1494418413.1890721
stackoverflow
1494418413.1992736
stackoverflow
1494418413.2094712
stackoverflow
1494418413.2196639
stackoverflow
1494418413.2298684
stackoverflow
1494418413.2400634
stackoverflow
1494418413.2502584
stackoverflow
1494418413.2604961
stackoverflow
1494418413.270702
stackoverflow
1494418413.2808678
stackoverflow
1494418413.2910736
stackoverflow
1494418413.301277
stackoverflow

因此计时器每 10 毫秒偏差 0.2 毫秒,这在几秒钟后是一个相当大的偏差。

我知道 python 并不是真正为“实时”而生的,但我认为应该有一种方法可以做到这一点。

如果有人已经必须使用 python 处理时间限制,我很乐意提供一些建议。

谢谢。

最佳答案

这段代码在我的笔记本电脑上运行 - 记录目标时间和实际时间之间的增量 - 主要是尽量减少 work() 函数中所做的事情,因为例如打印和滚动屏幕可能需要很长时间。

关键是根据调用时间与目标时间之间的差异启动下一个计时器。

我将间隔减慢到 0.1 秒,这样更容易看到抖动,在我的 Win7 x64 上可能超过 10 毫秒,这会导致向 Timer() 调用传递负值时出现问题:-o

这会记录 100 个样本,然后打印它们 - 如果您重定向到 .csv 文件,则可以加载到 Excel 中以显示图表。

from multiprocessing import Queue
import threading
import time

# this accumulates record of the difference between the target and actual times
actualdeltas = []

INTERVAL = 0.1

def work(queue, target):
# first thing to do is record the jitter - the difference between target and actual time
actualdeltas.append(time.clock()-target+INTERVAL)
# t0 = time.clock()
# print("Current time\t" + str(time.clock()))
# print("Target\t" + str(target))
# print("Delay\t" + str(target - time.clock()))
# print()
# t0 = time.clock()
if len(actualdeltas) > 100:
# print the accumulated deltas then exit
for d in actualdeltas:
print d
return
threading.Timer(target - time.clock(), work, [queue, target+INTERVAL]).start()

myQueue = Queue()

target = time.clock() + INTERVAL
work(myQueue, target)

典型输出(即 Python 中不依赖 Windows 上的毫秒计时):

0.00947008617187
0.0029628920052
0.0121824719378
0.00582923077099
0.00131316206917
0.0105631524709
0.00437298744466
-0.000251418553351
0.00897956530515
0.0028528821332
0.0118192949105
0.00546301269675
0.0145723546788
0.00910063698529

关于Python、Raspberry pi,每10毫秒精确调用一次任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com