通常,當linux系統啓動時,它實際上需要來自RTC的參考時間並且自己運行一個軟件定時器[即通常稱爲系統時鐘/掛鐘] 。當系統即將關閉時,它會使用RTC同步其掛鐘時間。我正在尋找一種在c中實現掛鐘的方法,與此類似。任何機構能爲我提出一些想法嗎?如何實現類似於linux系統時鐘的c時鐘
由於提前,
Anandhakrishnan拉瑪沙米。
通常,當linux系統啓動時,它實際上需要來自RTC的參考時間並且自己運行一個軟件定時器[即通常稱爲系統時鐘/掛鐘] 。當系統即將關閉時,它會使用RTC同步其掛鐘時間。我正在尋找一種在c中實現掛鐘的方法,與此類似。任何機構能爲我提出一些想法嗎?如何實現類似於linux系統時鐘的c時鐘
由於提前,
Anandhakrishnan拉瑪沙米。
操作系統通常會做的是從RTC或HPET或任何其他計時器設備獲取系統啓動時間。並且在PIC或APIC中加載一個值以接收來自它們的週期性中斷(例如每100ms後)。基於這些中斷系統時鐘或掛鐘的值得到更新。
如果不依賴於操作系統提供的功能,您無法在純C中使用它。原因是操作系統通過多進程來調度多個應用程序,並且您的C應用程序無法瞭解調度程序何時掛起的知識。
因此,您必須使用Posix功能,如gettimeofday()
,time()
等。
它很難做到100%正確。您必須檢測CPU進入睡眠狀態的時間,系統是否暫停,以及有人何時更改時區或夏令時開始或結束時。你必須自己做所有這些事情。
今天的所有CPU都有一個高分辨率定時器。它只是一個可以增加每個CPU時鐘週期的寄存器。如果您知道CPU的頻率,並且您定期讀取該寄存器(例如,通常不會溢出),則可以測量時間。
在Linux上有功能的家庭,讀取該寄存器給你,並計算出CPU的頻率,並返回時間在寄存器中的納米秒:
timespec ts;
clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
u64 timeInNanoSeconds = ts.tv_nsec + (ts.tv_sec * 1000000000LL);
時間會環繞每5分鐘左右。所以你必須經常閱讀它,所以你可以檢測環繞。因此,無論何時你閱讀它,如果ts.tv.nsec小於上次調用它的時間,那麼你有溢出,你必須對它進行解釋。
一旦你可以準確地測量秒的通過,那麼你可以從那裏建立你的掛鐘。
好的,那麼linux系統時鐘是如何實現的,他們是否真的會做所有這些檢查CPU睡眠?我們可以看到linux系統時鐘的源代碼嗎?看看下面的鏈接... http://www.tldp.org/LDP/sag/html/hw-sw-clocks.html – 2014-10-01 06:42:09
有關於C計時器函數('getitimer','setitimer','timer_create','timer_gettime','timer_settime'等等)的解讀。 – isedev 2014-09-30 13:48:42
用戶空間中的所有計時方法都依賴於內核提供的時間函數。 – Peter 2014-10-01 13:24:12