将msec转换为jiffies

将msec转换为jiffies,c,linux,device-driver,C,Linux,Device Driver,我使用msecs_to_jiffies(msecs)来获得延迟。我需要16毫秒的延迟。但问题是函数返回1用于输入1-10,2用于输入11-20,3用于输入21-30,等等。因此,我无法设置适当的延迟。我只能将延迟设置为10ms。我不能更改HZ值,也不能更改功能cant sleep 请提出这个问题的解决方案。 谢谢整整16毫秒你都睡不着。你可以至少睡16毫秒,但不能睡16毫秒。这不是Linux(或任何其他桌面操作系统)的工作方式——它们不是实时操作系统,它们是以不确定的方式调度的,您对此无能为力

我使用msecs_to_jiffies(msecs)来获得延迟。我需要16毫秒的延迟。但问题是函数返回1用于输入1-10,2用于输入11-20,3用于输入21-30,等等。因此,我无法设置适当的延迟。我只能将延迟设置为10ms。我不能更改HZ值,也不能更改功能cant sleep

请提出这个问题的解决方案。 谢谢

整整16毫秒你都睡不着。你可以至少睡16毫秒,但不能睡16毫秒。这不是Linux(或任何其他桌面操作系统)的工作方式——它们不是实时操作系统,它们是以不确定的方式调度的,您对此无能为力


不管你想做什么,你都得换一种方式去做。由于您提供的信息很少,我只能说您试图做的事情无法完成。

您的系统HZ值似乎设置为100

如果您希望以低于系统HZ的分辨率暂停执行一段时间,则需要使用主板中支持并在内核中启用的高分辨率计时器(使用nsec分辨率,而不是jiffies)。有关如何使用它们的界面,请参见此处:


因此,要么将系统频率更改为1000并获得1毫秒的jiffie分辨率,要么使用高分辨率计时器。

即使使用更高分辨率的计时器或1毫秒的jiffie分辨率,也不能保证线程只会休眠/延迟16毫秒(即使有一些晃动空间)。您需要专门的硬件和中断,因为它是一个内核驱动程序,所以可能没有线程这样的调度实体。如果设备驱动程序愿意,它可以轻松地绑定内核而不被抢占,但这不是一个好主意。@MahmoudAl Qudsi您不需要专门的硬件,只需要一个能够支持一次性模式和所需分辨率的计时器。您确实需要一个能够进行实时操作的操作系统,Linux就是这样,需要Linux RT补丁。请看:对于一些延迟数字是的,我熟悉RT补丁-这是一个相当令人印象深刻和雄心勃勃的项目,有很多现实世界的应用程序。但是如果没有它,只有专门的硬件可以提供帮助。请记住,在没有睡眠的情况下执行16毫秒的延迟是非常糟糕的,因为您可能想出的任何方法都会将CPU占用16毫秒。