在特定时刻执行功能,毫秒精度

问题描述

在特定时间尝试执行功能时遇到问题。

我的想法是我有一个while循环一段随机的时间,在这段时间内我需要在随机产生的时间执行一次50ms的哔声,然后重新分配它(因此从理论上讲它可以被调用1-3次)。

如何确保准确的时间安排? 现在我使用:

random_time_loop = np.round(np.random.uniform(4,7),3)
random_time_tone = np.round(np.random.uniform(2,3),3)

print("Random_time: {}; random_time_tone: {}".format(random_time_loop,random_time_tone))

t_end = (datetime.datetime.Now() + datetime.timedelta(seconds=random_time_loop)).time()
t_tone = (datetime.datetime.Now() + datetime.timedelta(seconds=random_time_tone)).time()

print("current: "+str(datetime.datetime.Now().time()))
print("t_end: "+ str(t_end))
print("t_ring: "+ str(t_tone))

while datetime.datetime.Now().time() < t_end:
    if(datetime.datetime.Now().time() == t_tone):
        print("Ring ring")
        print(str(datetime.datetime.Now().time()) + "==" + str(t_tone))
        random_time_tone = np.round(np.random.uniform(2,3)
        t_tone = (datetime.datetime.Now() + datetime.timedelta(seconds=random_time_tone)).time()
        print("New tone random time: {} ringing at: {}".format(random_time_tone,t_tone))
print("ended: {}".format(datetime.datetime.Now().time()))

此实现的输出

Random_time: 5.684; random_time_tone: 2.909
current: 12:32:36.713071
t_end: 12:32:42.397056
t_ring: 12:32:39.622069
Ring ring
12:32:39.622101==12:32:39.622069
New tone random time: 2.663 ringing at: 12:32:42.285198
ended: 12:32:42.397059

可以看出,当前时间与函数执行时间并不完全相同。此外,原计划以* 42.285198敲响,但即使进程以* 42.397059结尾也没有发生。是否可以确保以毫秒为单位的精确执行?我已经检查了其他一些解决方案,但是大多数解决方案都试图偶尔执行一些操作,并且不会在如此波动的时间中运行。

PS。我知道执行代码时会有一个小的延迟,因此datetime.Now()可能会有所不同,特别是在声明t_end和t_tone时(可能是一个不好的实现,而是使用分配了相同当前时间的单个“ current_time”变量)。尽管如此,在比较时间时如何确保毫秒精度。

提前谢谢!

解决方法

在计算机“通用”操作系统中执行此操作是不可能的,您需要某种称为RTOS的OS,它在嵌入式系统编程中用于解决这种类型的准确性。

如果您对此进行更多研究,您会发现存在一种称为“计时器中断”的东西,这是一种硬件,其主要功能是这类事情。

您需要另一种在硬件附近“实现”的方法。

当您对微控制器进行编程时,使用此类计数器进行计时器事件非常常见,基本上,将计数器设置为0时,它会执行某些操作,并且您可以设置毫秒,微秒等,这就是此类物用于机器人技术和电信等其他特殊应用。

这是一个与通用操作系统相距甚远的世界,您需要了解很多有关C和harware编程的知识。