1. 程式人生 > >Linux裝置驅動程式學習筆記7--時間、延遲及延緩操作

Linux裝置驅動程式學習筆記7--時間、延遲及延緩操作

#include <linux/timer.h>
struct timer_list {
    struct list_head entry;
    unsigned long expires;/*期望定時器執行的絕對 jiffies 值,不是一個 jiffies_64 值,因為定時器不被期望在將來很久到時*/
    void (*function)(unsigned long); /*期望呼叫的函式*/
    unsigned long data;/*傳遞給函式的引數,若需要在引數中傳遞多個數據項,可以將它們捆綁成單個數據結構並且將它的指標強制轉換為 unsiged long 的指標傳入。這種做法在所有支援的體系上都是安全的並且在記憶體管理中相當普遍*/
    struct tvec_t_base_s *base;
#ifdef CONFIG_TIMER_STATS
    void *start_site;
    char start_comm[16];
    int start_pid;
#endif
};
/*這個結構必須在使用前初始化,以保證所有的成員被正確建立(包括那些對呼叫者不透明的初始化):*/
void init_timer(struct timer_list *timer);
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
/*在初始化後和呼叫 add_timer 前,可以改變 3 個公共成員:expires、function和data*/
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);/*在到時前禁止一個已註冊的定時器*/
int del_timer_sync(struct timer_list *timer); /*如同 del_timer ,但還保證當它返回時, 定時器函式不在任何 CPU 上執行,以避免在 SMP 系統上競態, 並且在 單處理器核心中和 del_timer 相同。這個函式應當在大部分情況下優先考慮。 如果它被從非原子上下文呼叫, 這個函式可能睡眠,但是在其他情況下會忙等待。當持有鎖時要小心呼叫 del_timer_sync ,如果這個定時器函式試圖獲得同一個鎖, 系統會死鎖。如果定時器函式重新註冊自己, 呼叫者必須首先確保這個重新註冊不會發生; 這通常通過設定一個" 關閉 "標誌來實現, 這個標誌被定時器函式檢查*/
int mod_timer(struct timer_list *timer, unsigned long expires); /*更新一個定時器的超時時間, 常用於超時定時器。也可在正常使用 add_timer時在不活動的定時器上呼叫mod_timer*/
int timer_pending(const struct timer_list * timer); /*通過呼叫timer_list結構中一個不可見的成員,返回定時器是否在被排程執行*/