Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux内核将滴答声/滴答声更改为高于1000赫兹_C_Linux - Fatal编程技术网

C linux内核将滴答声/滴答声更改为高于1000赫兹

C linux内核将滴答声/滴答声更改为高于1000赫兹,c,linux,C,Linux,在linux中,是否可以更改它的计时速率以获得更高的时间分辨率 在我的系统中,默认分辨率设置为1000hz,这意味着我的最小延迟为1ms,我需要一个延迟为1us甚至1ns的percise系统,但我不知道是否有可能将其更改为1000hz以上 如果可以改变,在哪里/如何实现 考虑到我写一个c脚本,还有其他的解决方法吗?当然,这取决于硬件(如果是特定的嵌入式)和内核版本,但是在现代Linux中,睡眠时间不受Jiffies的控制。2.6.24以上的Linux内核可以使用高精度事件计时器(HPET)来触发

在linux中,是否可以更改它的计时速率以获得更高的时间分辨率

在我的系统中,默认分辨率设置为1000hz,这意味着我的最小延迟为1ms,我需要一个延迟为1us甚至1ns的percise系统,但我不知道是否有可能将其更改为1000hz以上

如果可以改变,在哪里/如何实现


考虑到我写一个c脚本,还有其他的解决方法吗?

当然,这取决于硬件(如果是特定的嵌入式)和内核版本,但是在现代Linux中,睡眠时间不受Jiffies的控制。2.6.24以上的Linux内核可以使用高精度事件计时器(HPET)来触发某些事件

它与应用程序睡眠无关。如果您想睡眠1ms或更短,则无需设置
CONFIG_HZ_1000

在Linux中,可以使用函数
usleep()
nanosleep()
。在运行Ubuntu的台式PC上,时钟分辨率已经达到1ns。然而,这并不意味着在非实时系统中完全睡眠几纳秒是可能的

检查此示例(使用gcc clock.c-O3-Wall-lrt-o clock编译):

在这种情况下,我的误差可以小于20美元

在对
clock\u gettime
的后续调用之间没有任何睡眠功能,我可以看到范围
200-900 ns
的延迟。因此,可以通过忙循环以
usec
精度测量睡眠:

clock_gettime(CLOCK_MONOTONIC, &tp1);
clock_gettime(CLOCK_MONOTONIC, &tp2);
while (get_diff(&tp1, &tp2) < ns_time_to_sleep)
    clock_gettime(CLOCK_MONOTONIC, &tp2);
clock\u gettime(clock\u单调,&tp1);
时钟获取时间(时钟单调,&tp2);
while(获取差异(&tp1和&tp2)
如果您只是在寻找更高的计时器分辨率,如纳秒,您可以使用,而不是乱搞jiffies。更多细节可以看出这一点。您的系统是否需要更高分辨率的调度程序才能更具反应性,或者您是否需要更高分辨率的时间测量?这是为了更好的反应时间,能够睡眠x us和/或执行每个x us,您可能会进入一个负载过重的系统。在这种情况下,你不会得到想要的效果。为什么不使用由
clock\u gettime(2)
syscall提供的高分辨率时钟?它使用的cpu滴答计数器比时钟滴答给出的
0.001s
分辨率更高。
sudo chrt --rr 99 ./clock
clock_gettime(CLOCK_MONOTONIC, &tp1);
clock_gettime(CLOCK_MONOTONIC, &tp2);
while (get_diff(&tp1, &tp2) < ns_time_to_sleep)
    clock_gettime(CLOCK_MONOTONIC, &tp2);