MicroPython sleep_us 谎言?

问题描述 投票:0回答:2

在从事另一个项目时,我在处理时间方面遇到了一些奇怪的事情。
尤其是

time.ticks_us()

我使用的是ESP32 S2模块。

代码:

from time import ticks_us, sleep_us
for i in range(100):
    t2 = ticks_us()
    sleep_us(1)
    t = ticks_us() - t2
    print(t)

未接近 1 μs。
最短:105 μs
最大值:120 μs

我记得它是 Python(在我的例子中是 MicroPython),但仍然如此。
它还取决于运行频率。

我错了吗?

这个“模式”没有用吗?

python time esp32 micropython
2个回答
-1
投票

我对 micropython 不熟悉,但在典型的多线程操作系统上,睡眠会放弃当前线程的时间片。睡眠是“最短”时间,但进程的线程可能在一段时间内不会再次被调度。自旋等待(不放弃线程时间片的循环)使用更多的 CPU,但可以更准确。它们对于非常短的等待很有用。 Windows 操作系统示例:

import time def spinwait(t): start = time.perf_counter() while time.perf_counter() - start < t: pass # Using sleep trials = [] for _ in range(1000): start = time.perf_counter() time.sleep(1e-6) trials.append(time.perf_counter() - start) print(f'min={min(trials):.09f}, ave={sum(trials) / 1000:.09f}, max={max(trials):.09f}') # using spinwait trials = [] for _ in range(1000): start = time.perf_counter() spinwait(1e-6) trials.append(time.perf_counter() - start) print(f'min={min(trials):.09f}, ave={sum(trials) / 1000:.09f}, max={max(trials):.09f}')

输出:

min=0.000006700, ave=0.000007603, max=0.000527600 min=0.000001500, ave=0.000001682, max=0.000003900



-2
投票
只是猜测,因为它是嵌入式开发

MCU 按时钟周期工作,并具有处理指令的机器周期(并且可能存在中断或其他具有更高优先级的系统功能)。如果 MCU 足够慢,它可能不会注意到 sleep_us() 已经工作了 100us,并在超过 100us 一段时间后结束该函数。

我建议如果某些事情确实需要经常发生,那么就让它在某个 while() 循环中。或者,如果它是可能被中断处理的东西,那么我们就使用它。如果流程具有精确的操作顺序,您可能还想使用状态机(或令牌处理)。

© www.soinside.com 2019 - 2024. All rights reserved.