版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1第第7 章章 時間管理時間管理度量時間差度量時間差延遲執(zhí)行延遲執(zhí)行 內(nèi)核定時器內(nèi)核定時器2度量時間差度量時間差度量時間差度量時間差系統(tǒng)定時硬件周期性地產(chǎn)生中斷信號,每秒產(chǎn)生中斷的次數(shù)稱為系統(tǒng)定時硬件周期性地產(chǎn)生中斷信號,每秒產(chǎn)生中斷的次數(shù)稱為HZ。 HZ 是一個依賴體系結(jié)構(gòu)的值是一個依賴體系結(jié)構(gòu)的值, 定義在定義在 中中或者該文件包含的某一個子平臺文件中?;蛘咴撐募哪骋粋€子平臺文件中。 在發(fā)布的內(nèi)核源碼中的在發(fā)布的內(nèi)核源碼中的缺省值在真實硬件上為缺省值在真實硬件上為 50 1200 ,大部分平臺為,大部分平臺為100 或者或者 1000; 流行的流行的 x86 PC 缺省是缺省是100
2、0,( 以前版本是以前版本是 100)增大增大HZ值可提高時間分辨率,但會增加系統(tǒng)負擔值可提高時間分辨率,但會增加系統(tǒng)負擔每次當時鐘中斷發(fā)生時每次當時鐘中斷發(fā)生時, 內(nèi)核內(nèi)部計數(shù)器的值就增加一。這個計內(nèi)核內(nèi)部計數(shù)器的值就增加一。這個計數(shù)器在系統(tǒng)啟動時初始化為數(shù)器在系統(tǒng)啟動時初始化為 0, 因此它代表從最近一次啟動以來因此它代表從最近一次啟動以來的時鐘中斷的時鐘中斷/滴答的數(shù)目。這個計數(shù)器是一個滴答的數(shù)目。這個計數(shù)器是一個 64位變量位變量( 即便在即便在 32位的體系上位的體系上),稱為,稱為 jiffies_64。 驅(qū)動開發(fā)者通常使用驅(qū)動開發(fā)者通常使用 jiffies 變量變量, 一個一個
3、unsigned long, 或者和或者和 jiffies_64 是相同或者是它的最低是相同或者是它的最低32位。位。 使用使用 jiffies 常常是首選常常是首選, 因為它更快因為它更快, 并且在并且在32位架構(gòu)上對位架構(gòu)上對jiffies_64 的訪問不是原子的的訪問不是原子的.3度量時間差度量時間差使用使用 jiffies 計數(shù)器計數(shù)器#include unsigned long j, stamp_1, stamp_half, stamp_n; j = jiffies; stamp_1 = j + HZ; stamp_half = j + HZ/2; stamp_n = j + n *
4、 HZ / 1000; /* n milliseconds */ 32位位 平臺上當平臺上當 HZ 是是 1000 時時, 計數(shù)器約計數(shù)器約 50 天溢出一天溢出一次次, 驅(qū)動程序應當注意這個事件。驅(qū)動程序應當注意這個事件。 使用下面的宏定義進行時間比較是安全的使用下面的宏定義進行時間比較是安全的4度量時間差度量時間差#include int time_after(unsigned long a, unsigned long b); a比比b靠后返回真靠后返回真int time_before(unsigned long a, unsigned long b); a比比b靠前返回真靠前返回真in
5、t time_after_eq(unsigned long a, unsigned long b); a比比b靠后或相等返回真靠后或相等返回真int time_before_eq(unsigned long a, unsigned long b); a比比b靠前或相等返回真靠前或相等返回真5度量時間差度量時間差計算時間差計算時間差diff = (long)t2 - (long)t1;將差轉(zhuǎn)化為毫秒將差轉(zhuǎn)化為毫秒msec = diff * 1000 / HZ; 保存當前時間(墻上時間)的結(jié)構(gòu)體保存當前時間(墻上時間)的結(jié)構(gòu)體struct timespec xtime;struct timespe
6、c _kernel_time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */;xtime.tv_sec存放著自存放著自1970年年1月月1日(日(UTC)以來的時間,)以來的時間,1970年年1月月1日稱為紀元日稱為紀元6度量時間差度量時間差當前時間與內(nèi)核jiffies變量的轉(zhuǎn)換#include unsigned long timespec_to_jiffies(struct timespec *value); void jiffies_to_timespec(unsigned long jiffies, struct times
7、pec *value)unsigned long timeval_to_jiffies(struct timeval *value); void jiffies_to_timeval(unsigned long jiffies, struct timeval *value); void do_gettimeofday(struct timeval *tv);/*返回自Epoch 以來的秒和微秒數(shù)*/struct timespec current_kernel_time(void);/*返回當前時間,精度1個jiffies */struct timespec xtime;struct times
8、pec _kernel_time_t tv_sec; /*秒 */ long tv_nsec; /*納秒 */;struct timeval xtime;struct timeval _kernel_time_t tv_sec; /*秒 */ _kernel_suseconds_t tv_usec; /*微秒 */;7第第7 章章 時間管理時間管理度量時間差度量時間差延遲執(zhí)行延遲執(zhí)行 內(nèi)核定時器內(nèi)核定時器8延遲執(zhí)行延遲執(zhí)行1、長延時、長延時延遲長于一個時鐘滴答延遲長于一個時鐘滴答忙等待忙等待while (time_before(jiffies, j1) cpu_relax( );J1為延遲終止
9、時間,為延遲終止時間,cpu_relax( )與架構(gòu)相關,不執(zhí)與架構(gòu)相關,不執(zhí)行大量處理器代碼。存在問題:行大量處理器代碼。存在問題: 如內(nèi)核配置為不可搶戰(zhàn),循環(huán)在延遲期間將鎖住處理如內(nèi)核配置為不可搶戰(zhàn),循環(huán)在延遲期間將鎖住處理器器 如內(nèi)核配置為可搶戰(zhàn)如內(nèi)核配置為可搶戰(zhàn),處理器不會被鎖住處理器不會被鎖住,但忙等待浪但忙等待浪費費 若循環(huán)前禁止了中斷,若循環(huán)前禁止了中斷,jiffies不會更新,將永遠不會更新,將永遠while9延遲執(zhí)行延遲執(zhí)行讓出處理器讓出處理器忙等待占著處理器,增加了系統(tǒng)負擔,下面的延遲讓忙等待占著處理器,增加了系統(tǒng)負擔,下面的延遲讓出處理器出處理器:while (time_
10、before(jiffies, j1) schedule( );當前進程雖然釋放了當前進程雖然釋放了CPU而不做任何事情,但它仍然而不做任何事情,但它仍然在運行隊列中,如果系統(tǒng)中只有一個可運行的進程,在運行隊列中,如果系統(tǒng)中只有一個可運行的進程,則又會立即運行??臻e任務得不到運行,耗電!則又會立即運行??臻e任務得不到運行,耗電!10延遲執(zhí)行延遲執(zhí)行超時超時#include long wait_event_timeout(wait_queue_head_t q, condition, long timeout);long wait_event_interruptible_timeout(wait
11、_queue_head_t q, condition, long timeout);調(diào)用上述函數(shù)的進程會在給定的等待隊列上休眠,但調(diào)用上述函數(shù)的進程會在給定的等待隊列上休眠,但是會在超時到期時返回。是會在超時到期時返回。如果超時到期,函數(shù)返回如果超時到期,函數(shù)返回0;而如果進程由其他事件喚;而如果進程由其他事件喚醒,則會返回剩余的延遲時間,并用醒,則會返回剩余的延遲時間,并用jiffies表示表示上述函數(shù)的使用需要聲明等待隊列頭,使用另一個函上述函數(shù)的使用需要聲明等待隊列頭,使用另一個函數(shù)可免除此麻煩數(shù)可免除此麻煩11延遲執(zhí)行延遲執(zhí)行#include signed long schedule_
12、timeout(signed long timeout); timeout是用是用jiffies表示的延遲時間,正常時返回表示的延遲時間,正常時返回0 schedule_timeout要求調(diào)用者首先設置當前進程的狀要求調(diào)用者首先設置當前進程的狀態(tài),例如:態(tài),例如:set_current_state(TASK_INTERRUPTIBLE);schedule_timeout (delay); 狀態(tài)也可設置為狀態(tài)也可設置為TASK_UNINTERRUPTIBLE12延遲執(zhí)行延遲執(zhí)行2、短延遲、短延遲有時驅(qū)動程序不但需要很短的延遲(比時鐘節(jié)拍短),如有時驅(qū)動程序不但需要很短的延遲(比時鐘節(jié)拍短),如1
13、ms,而且要求延遲精度高,此時前面基于而且要求延遲精度高,此時前面基于jiffies的長延遲就不能用了的長延遲就不能用了。如。如100Hz時鐘,節(jié)拍間隔至少為時鐘,節(jié)拍間隔至少為10ms,1000Hz時鐘,其節(jié)拍時鐘,其節(jié)拍間隔也只能到間隔也只能到1ms。#include void udelay(unsigned long usecs);void ndelay(unsigned long nsecs);void mdelay(unsigned long msecs);udelay以以忙等待方式忙等待方式將任務延遲指定的微秒,其他函基于此函將任務延遲指定的微秒,其他函基于此函數(shù)實現(xiàn)數(shù)實現(xiàn)udel
14、ay的實現(xiàn)使用軟件循環(huán),根據(jù)引導期間計算出處理器速度的實現(xiàn)使用軟件循環(huán),根據(jù)引導期間計算出處理器速度及及l(fā)oops_per_jiffy變量確定循環(huán)次數(shù)變量確定循環(huán)次數(shù)13延遲執(zhí)行延遲執(zhí)行上述延遲基于忙等等函數(shù),延遲過程中無法運行其他上述延遲基于忙等等函數(shù),延遲過程中無法運行其他任務任務下列基于下列基于schedule_timeout()的短延遲不涉及忙等待的短延遲不涉及忙等待void msleep(unsigned int millisecs);unsigned long msleep_interruptible(unsigned int millisecs);void ssleep(unsi
15、gned int seconds)上述函數(shù)將調(diào)用進程延遲指定的時間上述函數(shù)將調(diào)用進程延遲指定的時間延遲到期時返回值為延遲到期時返回值為0提前喚醒時返回值為原所求休眠時間的剩余毫秒數(shù)提前喚醒時返回值為原所求休眠時間的剩余毫秒數(shù)14第第7 章章 時間管理時間管理度量時間差度量時間差延遲執(zhí)行延遲執(zhí)行 內(nèi)核定時器內(nèi)核定時器15內(nèi)核定時器內(nèi)核定時器內(nèi)核定時器是將任務推遲到將來的某個時間執(zhí)行的一內(nèi)核定時器是將任務推遲到將來的某個時間執(zhí)行的一種機制種機制定時器的分類定時器的分類低分辨率定時器:基于周期性事件,也稱經(jīng)典定時器低分辨率定時器:基于周期性事件,也稱經(jīng)典定時器高分辨率定時器:基于時鐘事件,高分辨率定
16、時器:基于時鐘事件,2.6開始引進,可選開始引進,可選配置,編譯進內(nèi)核配置,編譯進內(nèi)核前面以及下面的討論均指低分辨率定時器前面以及下面的討論均指低分辨率定時器16內(nèi)核定時器內(nèi)核定時器內(nèi)核定時器的實現(xiàn)基于內(nèi)核定時器的實現(xiàn)基于TIMER_SOFTIRQ軟中斷軟中斷softirq17內(nèi)核定時器內(nèi)核定時器軟中斷的實現(xiàn)需要經(jīng)過三個步驟:軟中斷的實現(xiàn)需要經(jīng)過三個步驟:1.分配索引號分配索引號/軟中斷號軟中斷號2.注冊注冊/安裝軟中斷處理程序安裝軟中斷處理程序3.觸發(fā)軟中斷觸發(fā)軟中斷內(nèi)核定時器基于軟中斷內(nèi)核定時器基于軟中斷TIMER_SOFTIRQ,其實現(xiàn),其實現(xiàn)也需要上述步驟也需要上述步驟第第1步,分配索
17、引號,步,分配索引號,已完成已完成第第2步,注冊步,注冊/安裝軟中斷安裝軟中斷TIMER_SOFTIRQ的處理程序的處理程序,在何處安裝在何處安裝?18內(nèi)核定時器內(nèi)核定時器Linux系統(tǒng)初始化期間調(diào)用系統(tǒng)初始化期間調(diào)用init_timers()為軟中斷為軟中斷TIMER_SOFTIRQ安裝中斷處理程序安裝中斷處理程序run_timer_softirqvoid _init init_timers(void) int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,(void *)(long)smp_proc
18、essor_id(); init_timer_stats(); BUG_ON(err = NOTIFY_BAD); register_cpu_notifier(&timers_nb); open_softirq(TIMER_SOFTIRQ, run_timer_softirq);19內(nèi)核定時器內(nèi)核定時器軟中斷軟中斷TIMER_SOFTIRQ安裝中斷處理程序安裝中斷處理程序run_timer_softirq后需要觸發(fā)才能運行,在何處觸發(fā)?在定時器中斷處理程序中觸發(fā)定時器軟中斷TIMER_SOFTIRQ注冊為中斷處理程序注冊為中斷處理程序定時器中斷處理程的核心函數(shù)是定時器中斷處理程的核心函
19、數(shù)是do_timer()與與update_process_times(),定時器軟中斷在定時器軟中斷在update_process_times()中觸中觸發(fā)發(fā)20內(nèi)核定時器內(nèi)核定時器do_timer()do_timer()負責全系統(tǒng)范圍的、全局性的任務:負責全系統(tǒng)范圍的、全局性的任務:更新更新jiffies值值,處理進程統(tǒng)計處理進程統(tǒng)計。在多處理器系統(tǒng)上,會選擇一個特定的。在多處理器系統(tǒng)上,會選擇一個特定的CPU來來執(zhí)行這兩個任務,而不涉及其他執(zhí)行這兩個任務,而不涉及其他CPUvoid do_timer(unsigned long ticks) jiffies_64 += ticks; upd
20、ate_wall_time(); calc_global_load();更新墻鐘時間更新墻鐘時間更新系統(tǒng)負載統(tǒng)計更新系統(tǒng)負載統(tǒng)計(確定在前1分鐘、5分鐘、15分鐘內(nèi),平均有多少個就緒狀態(tài)的進程在就緒隊上等等)21內(nèi)核定時器內(nèi)核定時器update_process_times()函數(shù)/* Called from the timer interrupt handler to charge one tick to the current * process. user_tick is 1 if the tick is user time, 0 for system. */void update_pro
21、cess_times(int user_tick)struct task_struct *p = current;int cpu = smp_processor_id();/* */account_process_tick(p, user_tick);run_local_timers();rcu_check_callbacks(cpu, user_tick);printk_tick();perf_event_do_pending();scheduler_tick();run_posix_cpu_timers(p);22內(nèi)核定時器內(nèi)核定時器account_process_tick 使用 acco
22、unt_user_time 或 account_sys_time 來更新進程在用戶態(tài)或核心態(tài)消耗的CPU時間,即 task structure 中的utime 或 stime成員。如果進程超出了Rlimit指定的CPU份額限制,那么還會每隔1秒發(fā)送 SIGXCPU 信號23內(nèi)核定時器內(nèi)核定時器run_local_timers觸發(fā)定時器軟中斷TIMER_SOFTIRQ,或?qū)ζ溥M行到期操作。void run_local_timers(void) hrtimer_run_queues(); /* raise the timer softirq */ raise_softirq(TIMER_SOFTI
23、RQ); softlockup_tick();scheduler_tick是一個用于CPU調(diào)度器的輔助函數(shù)run_posix_cpu_timers使當前注冊的POSIX定時器開始運行24內(nèi)核定時器內(nèi)核定時器軟中斷TIMER_SOFTIRQ被觸發(fā)后,其處理程序run_timer_softirq稍后即可執(zhí)行,處理程序做什么事?下面先介紹定時器數(shù)據(jù)結(jié)構(gòu)與定時器管理再介紹處理程序25內(nèi)核定時器內(nèi)核定時器定時器數(shù)據(jù)結(jié)構(gòu)定時器數(shù)據(jù)結(jié)構(gòu)struct timer_list struct list_head entry; unsigned long expires; void (*function)(unsig
24、ned long); unsigned long data; struct tvec_t_base_s *base;entry:定時器鏈表的入口expires:定時器到期時間,單位是jiffiesfunction:指向定時器處理函數(shù),超時時調(diào)用base;指向一個基元素,其中的定時器按到期時間排序26內(nèi)核定時器內(nèi)核定時器kernel/timer.cstruct tvec_t_base_s .unsigned long timer_jiffies;tvec_root_t tv1;tvec_t tv2;tvec_t tv3;tvec_t tv4;tvec_t tv5; _cacheline_alig
25、ned_in_smp;typedef struct tvec_s struct list_head vecTVN_SIZE; tvec_t;typedef struct tvec_root_s struct list_head vecTVR_SIZE; tvec_root_t;6425627內(nèi)核定時器內(nèi)核定時器第第1組組256項項,到期時間到期時間0255第第2組組64項項,第第1項到期時間項到期時間256256*2-1,第第2項到期時間項到期時間512256*3-1,第,第3項到期時間以此類推項到期時間以此類推第第3、4、5組與第組與第2組類似組類似base存儲到期時間為0的定時器的stru
26、ct time_list到期時間1到期時間255到期時間256511到期時間512-76728內(nèi)核定時器內(nèi)核定時器1.第第1組中的索引項指向的數(shù)組元素,保存了稍后即將執(zhí)行的組中的索引項指向的數(shù)組元素,保存了稍后即將執(zhí)行的各定時器的各定時器的time_list實例。每當遇到一個時鐘中斷時,內(nèi)實例。每當遇到一個時鐘中斷時,內(nèi)核都掃描該鏈表,執(zhí)行所有定時器函數(shù),并將索引位置加核都掃描該鏈表,執(zhí)行所有定時器函數(shù),并將索引位置加1。剛執(zhí)行過的定時器則從數(shù)據(jù)結(jié)構(gòu)中移除。下一次發(fā)生時。剛執(zhí)行過的定時器則從數(shù)據(jù)結(jié)構(gòu)中移除。下一次發(fā)生時鐘中斷時,將執(zhí)行新的數(shù)組位置上的的定時器,并將其從鐘中斷時,將執(zhí)行新的數(shù)組位
27、置上的的定時器,并將其從數(shù)據(jù)結(jié)構(gòu)中移除,同樣將索引加數(shù)據(jù)結(jié)構(gòu)中移除,同樣將索引加1,依次類推。在所有項都,依次類推。在所有項都處理后,索引值為處理后,索引值為255,將索引值回,將索引值回0。2.將第將第2組的第組的第1項移至第項移至第1組的組的256項中,其余項依次前移。項中,其余項依次前移。第第3、4、5組亦如此。組亦如此。3.重復重復1的操作的操作29內(nèi)核定時器內(nèi)核定時器定時器處理程序定時器處理程序run_timer_softirq()static void run_timer_softirq(struct softirq_action *h) struct tvec_base *bas
28、e = _get_cpu_var(tvec_bases); hrtimer_run_pending(); if (time_after_eq(jiffies, base-timer_jiffies)_run_timers(base);30內(nèi)核定時器內(nèi)核定時器static inline void _run_timers(struct tvec_base *base)struct timer_list *timer;spin_lock_irq(&base-lock);while (time_after_eq(jiffies, base-timer_jiffies) while (!list
29、_empty(head) void (*fn)(unsigned long); unsigned long data;timer = list_first_entry(head, struct timer_list,entry);fn = timer-function;data = timer-data;detach_timer(timer, 1);spin_unlock_irq(&base-lock);call_timer_fn(timer,fn,data);Spin_unlock_irq(&base-lock)_run_timers()31內(nèi)核定時器內(nèi)核定時器2、使用定時器
30、、使用定時器定時器的使用很簡單,只需創(chuàng)建一個定時器結(jié)構(gòu)體定時器的使用很簡單,只需創(chuàng)建一個定時器結(jié)構(gòu)體struct time_list,編寫超時時執(zhí)行的處理函數(shù),然后激活即可,共,編寫超時時執(zhí)行的處理函數(shù),然后激活即可,共3步步。1)創(chuàng)建定時器結(jié)構(gòu)體)創(chuàng)建定時器結(jié)構(gòu)體DEFINE_TIMER(_name, _function, _expires, _data)靜態(tài)創(chuàng)建一個timer_list結(jié)構(gòu)實例name: timer_list結(jié)構(gòu)名稱function:處理函數(shù)expires:到期時間data:傳給處理函數(shù)的參數(shù)struct timer_list struct list_head entry;
31、unsigned long expires;void (*function)(unsigned long); unsigned long data;struct tvec_t_base_s *base;32內(nèi)核定時器內(nèi)核定時器也可動態(tài)創(chuàng)建一個timer_list結(jié)構(gòu)實例struct timer_list my_timer;init_timer(&my_timer);填充數(shù)據(jù)結(jié)構(gòu)my_timer.expires = jiffies + delay; my_timer.data = 0; my_timer.function = my_function; struct timer_list
32、struct list_head entry;unsigned long expires;void (*function)(unsigned long); unsigned long data;struct tvec_t_base_s *base;33內(nèi)核定時器內(nèi)核定時器2)編寫定時器處理函數(shù))編寫定時器處理函數(shù)void my_timer_function(unsigned long data);3)激活定時器add_timer(&my_timer);/*將定時器插入管理數(shù)組中*/定時器其他操作更改已激活定時器的超時時間mod_timer(&my_timer, jiffies
33、+ new_delay); /* new expiration */超時前刪除定時器del_timer(&my_timer);del_timer_sync(&my_timer);34內(nèi)核定時器內(nèi)核定時器例例1 jitimer1)jitimer聲明及初始化聲明及初始化struct jit_data struct timer_list timer; struct tasklet_struct tlet; int hi; wait_queue_head_t wait; unsigned long prevjiffies; unsigned char *buf; int loops;3
34、5內(nèi)核定時器內(nèi)核定時器int jit_timer(char *buf, char *start, off_t offset, int len, int *eof, void *unused_data)struct jit_data *data;char *buf2 = buf;unsigned long j = jiffies;data = kmalloc(sizeof(*data), GFP_KERNEL);if (!data) return -ENOMEM;init_timer(&data-timer);init_waitqueue_head (&data-wait);/*
35、 write the first lines in the buffer */buf2 += sprintf(buf2, time delta inirq pid cpu commandn);buf2 += sprintf(buf2, %9li %3li %i %6i %i %sn,j, 0L, in_interrupt() ? 1 : 0,current-pid, smp_processor_id(), current-comm);/* fill the data for our timer function */36內(nèi)核定時器內(nèi)核定時器data-prevjiffies = j;data-b
36、uf = buf2;data-loops = JIT_ASYNC_LOOPS;/* register the timer */data-timer.data = (unsigned long)data;data-timer.function = jit_timer_fn;data-timer.expires = j + tdelay; /* parameter */add_timer(&data-timer);/* 激活定時器 */wait_event_interruptible(data-wait, !data-loops);if (signal_pending(current)re
37、turn -ERESTARTSYS;buf2 = data-buf;kfree(data);*eof = 1;return buf2 - buf;37內(nèi)核定時器內(nèi)核定時器2)編寫)編寫jitimer處理函數(shù)處理函數(shù)void jit_timer_fn(unsigned long arg)struct jit_data *data = (struct jit_data *)arg;unsigned long j = jiffies;data-buf += sprintf(data-buf, %9li %3li %i %6i %i %sn, j, j - data-prevjiffies, in_i
38、nterrupt() ? 1 : 0, current-pid, smp_processor_id(), current-comm);if (-data-loops) data-timer.expires += tdelay;data-prevjiffies = j;add_timer(&data-timer); else wake_up_interruptible(&data-wait); 38內(nèi)核定時器內(nèi)核定時器int _init jit_init(void)create_proc_read_entry(currentime, 0, NULL, jit_currentime
39、, NULL);create_proc_read_entry(jitbusy, 0, NULL, jit_fn, (void *)JIT_BUSY);create_proc_read_entry(jitsched,0, NULL, jit_fn, (void *)JIT_SCHED);create_proc_read_entry(jitqueue,0, NULL, jit_fn, (void *)JIT_QUEUE);create_proc_read_entry(jitschedto, 0, NULL, jit_fn, (void *)JIT_SCHEDTO);create_proc_read
40、_entry(jitimer, 0, NULL, jit_timer, NULL);create_proc_read_entry(jitasklet, 0, NULL, jit_tasklet, NULL);create_proc_read_entry(jitasklethi, 0, NULL, jit_tasklet, (void *)1);return 0; /* success */module_init(jit_init);39內(nèi)核定時器內(nèi)核定時器例例 2 shortprint1)聲明及初始化定時器聲明及初始化定時器 static struct timer_list shortp_timer; #define TIMEOUT 5*HZ /* Wait a long time */在在shortp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年研究生考試考研英語(二204)試卷及答案指導
- 數(shù)控車床違反作業(yè)流程處罰制度
- 代理采購業(yè)務協(xié)議范本2024
- 2024年股權轉(zhuǎn)讓及權益變更協(xié)議
- 2024年度中藥材種植種子銷售協(xié)議
- 2024批量門禁設備購銷協(xié)議樣本
- 2024年不動產(chǎn)即售協(xié)議模板
- 2024建筑泥水工施工分包協(xié)議范本
- 2024年度砌磚物流服務協(xié)議條款
- 2023-2024學年云南省昭通市大關縣民族中學高三素質(zhì)班第二次考查數(shù)學試題
- 青少年成才優(yōu)秀家庭教育-感恩教育主題班會
- 企業(yè)新聞宣傳工作經(jīng)驗分享課件
- 閱讀理解中句子賞析的方法-課件
- 2023年黑龍江交易集團有限公司招聘筆試題庫及答案解析
- 景觀小品的設計課件
- 商務禮儀說課
- 結(jié)直腸癌肝轉(zhuǎn)移消融課件
- 項目管理系列課程之進度管理課件
- 空間大地測量學課件
- 綠色產(chǎn)品管制作業(yè)程序
- 二年級公開課教案武術基本功練習和五步拳教案
評論
0/150
提交評論