2、x/sched.h>,型別為unsignedlongvolatile,核心會確保溢位之後還能正確運作,驅動程式不必擔心jiffies溢位.36.1.1處理器特有的暫存器大多數系統上,由於指令時序的不可預測性(因為有指令排程、分支預測、快取記憶體等因素),時脈計數器成為唯一可靠的精密計時工具.時脈計數器的設計隨平台而異,不一定可寫,長度也不一定是32bits或64bits,無論是否可歸零,建議不要如此,因為可以使用無號變數來計算差值.最知名的時脈計數暫存器是x86Pentium系列的TSC(TimeStampCounter),為計算CPU時脈週期數的64bit
3、s的暫存器,kernel&user-space都可以讀取.引入(Machine-SpecificRegisters)之後,可使用下列巨集rdtsc(low,high);rdtscl(low);46.1.1處理器特有的暫存器(Cont.)量測指令本身執行時間unsignedlongini,end;rdtscl(ini);rdtscl(end);printk(“timelapse:%li”,end-ini);與平台無關(適用各種平台)的函式用來替代rdstc()#includecycles_tget_cyc
4、les(void);//無時脈計數,則回傳TSC暫存器低半段的值,因為可避免多暫存器操作的問題且時脈計數器主要用途為測量極短的時間如何內插組語指令(inilineassembly)將x86的rdtscl()移植到MIPS系統組語指令Movefromcoprocessor0#definerdtscl(dest)__asm____volatile__(“mfc0%0,$9;nop”:“=r”(dest))內插組語的語法相當有威力,但是有點複雜,特別是在那些會限定暫存器用途的平台上(x86系列).完整語法請參考gcc的說明文件.56.2取得目前時間在Kernel
5、-space的程式可以從jiffies的值取得目前時間jiffies從開機到至今的時間,與驅動程式生命期無關,也不可能跨越開關機時間.驅動程式可利用jiffies的現值來估算兩事件之間的間隔時間,如mousedriver驅動程式不需要知道牆鐘時刻(wall-clocktime),若真的需要靠自己處理當時的時刻,do_gettimeofday()或許可派上用場.此函式並非直接告知今天是星期幾,而是將一般的秒與微秒填入一個structtimeval,原型如下#includevoiddo_gettimeofday(structtimev
6、al*tv);66.2取得目前時間(Cont.)從xtime變數同樣也可取得目前時刻,但這是不被鼓勵的行為,因為無法連動(atomically)取得timevalue,結構內的tv_sec與tv_usec欄位值,除非暫停掉中斷.若不太講求精準度,2.2版核心提供一個快又安全的函式來取得目前時刻:voidget_fast_time(structtimeval*tv);範例jit(JustInTime)模組,它不會產生裝置節點,而是直接將它取得的時刻資訊透過/proc/currentime傳到user-space.cat/proc/currentime/proc
7、/currentime/proc/currentime76.3延遲執行驅動程式通常需要拖延某段程式碼的開始執行時間—通常是為了讓硬體有足夠充裕的時間完成某些工作需要考慮的重點之一,是延遲時間是否超過一個時脈單位較長的延遲,可以利用系統時鐘來計時,較短的延遲,則通常以軟體迴圈來應付86.3.1長期延遲(1/4)最簡單也是最蠢的做法,稱為忙著等待(busywaiting):unsignedlongj=jiffies+jit_delay*HZ;while(jiffies8、(不使用快取技術).在延遲期間,處理器是被鎖死的,因