Linux核心時間管理相關的介面
阿新 • • 發佈:2019-01-29
在核心經常會碰到一些要定時排程的任務,可以用timer處理,下面來看看都有哪些介面,
/*******************************************************************/
linux/param.hHZ;//巨集,每秒定時器中斷的次數,也即是系統每秒節拍或稱滴答數
linux/sched.h;包含了linux/jiffies.h
jiffies_64;//自系統啟動的滴答數
jiffies;//上面的低有效位...............它們明顯是隻讀的
linux/jiffies.h;...............包含一些巨集用來比較快取的值和當前值
int time_after(unsignde long a,unsigned long b);
int time_before(unsignde long a,unsigned long b);
int time_after_eq(unsignde long a,unsigned long b);
int time_before_eq(unsignde long a,unsigned long b);
linux/time.h;..................jiffies到struct timeval,struct timespec轉換
unsigned long timespec_to_jiffies(struct timespec*value);
void jiffies_to_timespec(unsigned long jiffies,struct timespec* value);
unsigned long timeval_to_jiffies(struct timeval* value);
void jiffies_to_timeval(unsigned long jiffies,struct timeval* value);
linux/jiffies.h
u64 get_jiffies_64(void);//讀取jiffies_64,而且完成了加鎖
linux/time.h
void do_gettimeofday(struct timeval *tv); /*獲取牆上
struct timespec current_kernel_time(void); /*時間
unsigned long mktime(unsigned int year,unsigned int mon,unsigned int day,
unsigned int hour,unsigned int min,unsigned int sec);/*轉換牆上時間到一個
jiffies值*/
while(time_before(jiffies,jl))
cpu_relax(); //一種延時方式,忙等待
while(time_before(jiffies,jl))
schedule(); //另一種延時方式,讓出cpu
linux/sched.h
signed long schedule_timeout(signed long num_jiffies)/*睡眠一定時間*/
set_current_state(TASK_INTERRUPTIBLE/TASK_UNINTERRUPTIBLE)/*一般先設定狀態
linux/delay.h //短的延時,忙等待的實現,實參有上限
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
void msleep(unsigned int msecs);//不可打斷的睡眠
unsigned long msleep_interruptbile(unsigned int msecs);//可打斷的睡眠
void ssleep(unsigned int secs);//不可打斷的睡眠
linux/timer.h //核心定時器,非同步執行,處於“軟體中斷”環境,確保原子性,一
//個任務可以註冊它本身在一定時間後執行,共享資源的競爭性,同一CPU執行
struct timer_list {
/*....*/
unsigned long expires;//jiffies值衡量,多長時間後執行
void (*function)(unsigned long);
unsigned long data;//傳遞給function的引數
};
void init_timer(struct timer_list *timer);
struct timer_list TIMER_INITIALIZER(_function,_expires,_data);
void add_timer(struct timer_list *timer);
int del_timer(struct timer_list *timer);
int mod_timer(struct timer_list *timer,unsigned long expires);//更新一個定
//時器,無論add_timer之前之後
int del_timer_sync(struct timer_list *timer);//返回時確保定時器函式不會在
//任一個CPU上執行,非原子上下文可能會睡眠,其他的會忙等待
int timer_pending(const struct timer_list *timer);//返回真假指示定時器任務
//當前是否在排程執行