linux内核微妙时,Linux内核模块时间同步函数汇总
在linux內(nèi)核模塊中能用到的函數(shù)比用戶空間多,但是它的函數(shù)往往被用得很少。當(dāng)然在內(nèi)核中葉可以調(diào)用用戶空間的函數(shù)只要直接調(diào)用系統(tǒng)調(diào)用的封裝函數(shù)就行,如下:
如調(diào)用long gettimeofday(struct timeval tv, struct timezone tz);函數(shù)可以直接調(diào)用封裝體:
_syscall1(long,gettimeofday, struct timeval,tv,struct timezone ,tz);
這個(gè)是現(xiàn)在內(nèi)核的系統(tǒng)調(diào)用標(biāo)準(zhǔn)形式,syscall后面接的數(shù)字表示這個(gè)系統(tǒng)調(diào)用類型,系統(tǒng)調(diào)用將參數(shù)個(gè)數(shù)的多少進(jìn)行了分類。
當(dāng)然也可以直接使用內(nèi)核特有的函數(shù),這樣效率更高:
獲得當(dāng)前時(shí)間函數(shù):
頭文件: time.h
屬性:系統(tǒng)符號(hào)導(dǎo)出函數(shù)
從jiffies得到時(shí)間
void do_gettimeofday(struct timeval *tv);
從xtimer墻上時(shí)間得到時(shí)間
struct timerspec current_kernel_time(void);
延時(shí):
長(zhǎng)延遲
頭文件:jeffies.h / time.h
while(time_before(jiffies,jiffies+msecs_to_jiffies(delay_time)){
schedule();
}
納秒,微妙,毫?秒延遲,必須是短延遲,時(shí)間過(guò)長(zhǎng)會(huì)報(bào)錯(cuò)
頭文件: delay.h
void ndelay(unsigned long nesec);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
void msleep(unsigned int millisecs);
void ssleep(unsigned int seconds);
超時(shí):
頭文件: wait.h
long wait_event_timerout(wait_queue_head_t q, condition, long timeout);
long wait_event_interruptible_timerout(wait_queue_head_t q, condition, long timeout);
定時(shí)器
頭文件:timer.h
定時(shí)器數(shù)據(jù)結(jié)構(gòu):
struct timer_list{
unsigned long expires;??????????? ?/* 超時(shí)時(shí)間*/
void (*fun)(unsigned long);????? /*超時(shí)做的事情的函數(shù)指針*/
unsigned long data;???????????????? /*函數(shù)數(shù)據(jù)參數(shù)*/
};
初始化定時(shí)器
void init_timer(struct timer_list *timer);
添加定時(shí)器
void add_timer(struct timer_list *timer);
銷毀定時(shí)器
int del_timer(struct timer_list *timer);
信號(hào)量函數(shù):
頭文件:semaphore.h
屬性:初始化函數(shù)是頭文件靜態(tài),其他函數(shù)時(shí)系統(tǒng)符號(hào)導(dǎo)出
1. 初始化信號(hào)量
static inline void sema_init(struct semaphore *sem, int val);
第一個(gè)參數(shù)信號(hào)量,第二個(gè)參數(shù)信號(hào)量初始值。
2. 獲得信號(hào)量
void down(struct semaphore *sem);
3.釋放信號(hào)量
void up(struct semaphore *sem);
4.在一定時(shí)間限制內(nèi)獲得信號(hào)量,返回值返回是得到信號(hào)量返回的還是超時(shí)返回
int down_timeout(struct semaphore *sem, long jiffies);
5. 非阻塞測(cè)試是否有可以得到信號(hào)量,返回值表明是否獲得了信號(hào)量。
int down_trylock(struct semaphore *sem)
6.可打斷的獲得信號(hào)量,返回值表示是一般返回還是被打斷
int down_interruptible(struct semaphore *sem)
7.獲得可打斷信號(hào)量,針對(duì)致命打斷如 kill信號(hào),返回如上
int down_killable(struct semaphore *sem)
軟中斷:
tasklet
1.初始化
頭文件:無(wú)
屬性:系統(tǒng)符號(hào)導(dǎo)出
void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data);
第一個(gè)參數(shù)是tasklet結(jié)構(gòu)體指針,第二個(gè)參數(shù)是執(zhí)行任務(wù)的函數(shù),第三個(gè)參數(shù)是數(shù)據(jù)結(jié)構(gòu)體指針。
2.調(diào)度tasklet
頭文件:interrupt.h
屬性:頭文件靜態(tài)
static inline void tasklet_schedule(struct tasklet_struct *t);
3.結(jié)束tasklet
屬性:系統(tǒng)符號(hào)導(dǎo)出
extern void tasklet_kill(struct tasklet_struct *t);
4.高精準(zhǔn)定時(shí)器tasklet
tasklet_hrtimer_init, tasklet_hrtimer_start,tasklet_hrtimer_cancel
工作隊(duì)列workqueue
1. 創(chuàng)建并初始化工作隊(duì)列
INIT_WORK(_work, _func);
頭文件:workqueue.h
屬性:頭文件宏定義
或者create_workqueue,這個(gè)好像沒(méi)有上面那個(gè)全面,不是很清楚。
2. 銷毀工作隊(duì)列
頭文件:workqueue.h
void destroy_workqueue(struct workqueue_struct *wq)
3. 重置工作隊(duì)列
頭文件:workqueue.h
int cancel_work_sync(struct work_struct *work);
4. 調(diào)度工作隊(duì)列,下面兩個(gè)函數(shù)一樣,s調(diào)用q
頭文件:workqueue.h
int schedule_work(struct work_struct *work)
int queue_work(struct workqueue_struct *wq, struct work_struct *work)
總結(jié)
以上是生活随笔為你收集整理的linux内核微妙时,Linux内核模块时间同步函数汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10 linux ssh自动启动,
- 下一篇: linux下imwbr1进程,Linux