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