2010-05-27 123 views
3

我有一个程序生成数据包发送到接收器。我需要一种有效的方法在发送每个数据包之间引入一个小的延迟,以免超出接收器。我试过usleep()和nanosleep(),但它们似乎太慢了。我已经实现了一个繁忙的等待循环,并取得了更多成功,但这不是最有效的方法,我知道。我对任何人尝试做我所做的事都感兴趣。其他人是否会发现usleep()和nanosleep()能够很好地适用于这种类型的应用程序?为什么nanosleep()和usleep()太慢?

感谢,

丹尼Llewallyn

+1

问题非常模糊 - 您需要多长时间的延迟,您为什么认为nanosleep/usleep无法提供这种延迟? – 2010-05-27 13:15:53

+3

显然,我们不知道你在做什么的细节,但我会认为nanosleep就足够了。 你的睡眠需要多准确?操作系统将保证至少所需的延迟时间将会发生 - 但它不会对超出睡眠请求时间的类似保证发出唤醒。 – sechastain 2010-05-27 13:23:24

+0

在我的Raspberry Pi上,需要更多的73us来调用nanosleep。我想我也必须去忙碌的循环。 – Nikodemus 2014-11-21 13:26:45

回答

2

这似乎是一个不好的设计。理想情况下,接收方将对接收到的任何额外数据进行排队,然后执行其单独线程的消息处理。通过这种方式,它可以处理突发数据,而不依赖发送者来限制其请求。

或许,如果(举例来说)你没有接收器的代码的控制权,或者如果这是一个嵌入式应用这种方法是不实际的。

+0

您正在假设接收器是某个计算机上的一些软件。如果某些硬件设备只有有限数量的传入数据包缓冲区,该怎么办? – JeremyP 2010-05-27 15:50:35

+0

绝对 - 我希望OP能在他的问题中澄清这一点。 – 2010-05-27 16:07:44

-1

而不是在数据包级别做事情,你需要担心超过接收者等事情。为什么不使用TCP流传输数据?让TCP处理流量控制和数据包重传等事情。

如果你已经有了投资的分组方法很多,你可以一直使用在TCP之上的一层,从TCP流中提取数据的原始数据包和饲料到这些现有的功能。

+0

对不起,它是UDP – user351990 2010-06-02 11:52:06

8

睡眠函数对于非常小的时间间隔的行为很大程度上取决于内核版本和配置。

如果你有一个“无滴答”的内核(CONFIG_NO_HZ)和高分辨率定时器,那么你可以期待睡眠非常接近你的要求。

否则,你通常会最终睡在定时器中断的粒度。定时器中断间隔可配置(CONFIG_HZ) - 10ms,4ms,3.3ms和1ms是常用选项。

+0

这个答案似乎在假设用户正在运行哪个操作系统。 – Powerlord 2010-05-27 16:00:43

+1

这是Debian。我应该更清楚。我认为这是问题。感谢您的回应。 – user351990 2010-06-02 11:52:54

2

假设其他评论者提到上级方法并不提供给你,然后在嵌入/微控制器土地常用的方法是创建所需长度的NOP环。

一个NOP操作需要一个CPU周期,在嵌入式环境中,你通常都知道什么时钟速度的处理器运行在所以你可以使用一个简单的for循环conatining _NOP()或只需要很短的延迟,然后不要打扰一个循环,只需添加所需数量的节点。

regTX = 0xFF; // Transmit FF on special register 

// Wait three clock cycles 
_NOP(); 
_NOP(); 
_NOP(); 

regTX = 0x00; // Transmit 00 
0

我可以在这里说Solaris,因为它使用OS定时器来唤醒睡眠呼叫。默认情况下,无论您在usleep中指定什么,最短等待时间将为10毫秒。但是,您可以使用/etc/system配置文件中的参数hires_tick = 1(1ms唤醒)和hires_hz =来增加定时器唤醒呼叫的频率。

相关问题