內核延時函數接口
延時的函數有delay
和sleep
兩種類型:
delay接口
void ndelay(unsigned long nsecs);//納秒延時
void udelay(unsigned long usecs);//微妙延時
void mdelay(unsigned long msecs);//毫秒延時
sleep接口
void msleep(unsigned int msecs);//毫秒級延時
long msleep_interruptible(unsigned int msecs);//毫秒級延時,可被信號打斷
void ssleep(unsigned int seconds);//秒級延時
delay和sleep的區別
delay
型延時:忙等待,占用CPU資源,延遲過程無法進行其他任務。
sleep
型延時:休眠,不占用CPU資源,其它模塊此時可以使用CPU資源。
低分辨率定時器
jiffies和HZ
jiffies
:全局變量,表示 系統啟動以來產生的節拍數 。每產生一次中斷,jiffies
自動加一。
HZ
:赫茲,也叫 節拍率 ,表示 每秒種產生多少次中斷 。
例如:HZ
為200
,代表每秒產生200
次中斷,那2
秒鐘jiffies
的值就應該是400
。因此系統的運行時間可以用jiffies/HZ表示。
一秒鐘:jiffies
+ HZ
表示一秒鐘
原因:內核中統計時間是通過jiffies,因此要比較時間或者定時也是通過jiffies。
例如程序運行一秒鐘,內核如何知道運行了一秒?答案是運行一秒后的jiffies值和運行前的jiffies值進行比較,如果相差為一個HZ,則代表一秒鐘。jiffies+HZ其實就是一秒后jiffies的值,所以jiffies+HZ可以間接表示一秒鐘。
定時2秒:jiffies
+ 2*HZ
。以此類推
獲取當前的jiffies
值,可以用get_jiffies_64()
函數。
將時間轉為對應的jiffies
值,可以用msecs_to_jiffies()
等函數,例如msecs_to_jiffies(1000)
代表1秒,函數返回值其實就是HZ
。
相關接口
#include< linux/timer.h >
struct timer_list {
struct list_head list;
unsigned long expires; //定時器到期時間,傳入的是jiffies值
unsigned long data; //作為參數被傳入定時器處理函數
void (*function)(unsigned long);
};
void init_timer(struct timer_list * timer);//初始化定時器
void add_timer(struct timer_list * timer);//添加一個定時器
int mod_timer(struct timer_list *timer, unsigned long expires);//修改定時器的定時時間expires
int del_timer(struct timer_list * timer);//刪除定時器
unsigned int jiffies_to_msecs (const unsigned long j);//將jiffies轉為對應的毫秒值
unsigned int jiffies_to_usecs (const unsigned long j);//將jiffies轉為對應的微秒值
unsigned long msecs_to_jiffies (const unsigned int m);//將毫秒值轉為對應的jiffies
unsigned long usecs_to_jiffies (const unsigned int u);//將微秒值轉為對應的jiffies
-
內核
+關注
關注
3文章
1378瀏覽量
40343 -
接口
+關注
關注
33文章
8668瀏覽量
151529 -
Linux
+關注
關注
87文章
11329瀏覽量
209967 -
函數
+關注
關注
3文章
4344瀏覽量
62809
發布評論請先 登錄
相關推薦
評論