2015-10-16 53 views
2

在Linux中可以改變更高時間分辨率的速率嗎?linux內核將ticks/jiffies改爲比1000更高的hz

默認分辨率設置爲1000赫茲在我的系統,這意味着我有1ms的最小延遲時間,我需要在1微秒甚至納秒的延遲一個更percise系統,但我不知道這是否是偶數有可能改變這個超過1000hz。

如果可以改變,在哪裏/如何完成?

有沒有可能有任何其他解決方法考慮即時編寫c腳本?

+0

如果你只是尋找更高的定時分辨率,如納米第二,你可以使用['clock_gettime()'](HTTP:/ /man7.org/linux/man-pages/man2/clock_gettime.2.html)而不是與jiffies混淆。更詳細的可以看到這個[回答](http://stackoverflow.com/a/6749766/1865106)。 – SSC

+0

您是否需要調度程序的更高分辨率才能使系統更具響應性,或者您是否需要更多的時間測量分辨率? –

+0

這是爲了更好的反應時間,能夠睡眠x我們和/或執行每一個x我們 – user3828657

回答

1

當然,這取決於硬件(如果特定的嵌入式)和內核版本,然而在現代Linux睡眠時間不受Jiffies控制。高於2.6.24的Linux內核可以具有高精度事件計時器(HPET)來觸發某些事件。

它與應用程序休眠無關。如果您想要睡眠1ms或更少,則不需要設置CONFIG_HZ_1000

在Linux中,您可以使用函數usleep()nanosleep()。在運行Ubuntu的臺式機中,時鐘分辨率已經是1ns。然而,這並不意味着在非實時系統中可以完美睡眠幾納秒。

檢查該示例(與gcc clock.c -O3 -Wall -lrt -o clock編譯):

#include <stdio.h> 
#include <unistd.h> 
#include <time.h> 

int main() 
{ 
    struct timespec res, tp1, tp2; 

    clock_getres(CLOCK_MONOTONIC, &res); 

    clock_gettime(CLOCK_MONOTONIC, &tp1); 
    usleep(100); 
    clock_gettime(CLOCK_MONOTONIC, &tp2); 

    printf("resolution: %ld sec %ld ns\n", res.tv_sec, res.tv_nsec); 
    printf("time1: %ld/%ld\n", tp1.tv_sec, tp1.tv_nsec); 
    printf("time2: %ld/%ld\n", tp2.tv_sec, tp2.tv_nsec); 
    printf("diff: %ld ns\n", (tp2.tv_sec - tp1.tv_sec) * 1000000000 + tp2.tv_nsec - tp1.tv_nsec); 

    return 0; 
} 

缺省情況下它發生,我有期望的睡眠時間以上另外的60周微秒的延遲。這種準確度對於幾百微秒的睡眠時間(我係統中的CONFIG_HZ=250)可以接受。

爲了減少延遲的過程中應具有較高優先級運行,例如:

sudo chrt --rr 99 ./clock 

在這種情況下,我可以有誤差小於20我們。

在後續調用clock_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);