timer_list

lethe1203發表於2024-03-25
參考資料:
《正點原子Linux驅動教程》
定時器是一個很常用的功能,需要週期性處理的工作都要用到定時器。Linux 核心定時器採用系統時鐘來實現,也就是arch timer。Linux 核心使用 timer_list 結構體表示核心定時器,timer_list 定義在檔案
include/linux/timer.h 中,定義如下:
struct timer_list {
     struct list_head entry;
     unsigned long expires; 
    /* 定時器超時時間,單位是節拍數 */
     struct tvec_base *base;
     void (*function)(unsigned long); /* 定時處理函式 */
     unsigned long data; 
    /* 要傳遞給 function 函式的引數 */
     int slack;
};
要使用核心定時器首先要先定義一個 timer_list 變數,表示定時器,tiemr_list 結構體的expires 成員變數表示超時時間,單位為節拍數。比如需要定義一個週期為 2 秒的定時器,那麼這個定時器的超時時間就是 jiffies+(2*HZ),因此 expires=jiffies+(2*HZ)。function 就是定時器超時以後的定時處理函式,我們要做的工作就放到這個函式里面,需要我們編寫這個定時處理函式。
timer_list的系列API:
void init_timer(struct timer_list *timer)                        // 初始化timer_list型別變數
void add_timer(struct timer_list *timer)                         // 向Linux核心註冊定時器
int del_timer(struct timer_list * timer)                         // 用於刪除一個定時器
int mod_timer(struct timer_list *timer, unsigned long expires)   // 用於修改定時值
測試demo:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/timer.h>

static struct timer_list my_timer;

static void my_timer_callback(struct timer_list *t)
{
    printk("Timer callback function is called!\n");
    // 在這裡可以執行定時器觸發時需要進行的操作
}

static int __init timer_demo_init(void)
{
    printk("Initializing timer demo\n");

    // 初始化定時器
    timer_setup(&my_timer, my_timer_callback, 0);

    // 設定定時器觸發時間為當前時間後的5秒
    mod_timer(&my_timer, jiffies + msecs_to_jiffies(5000));

    return 0;
}

static void __exit timer_demo_exit(void)
{
    del_timer(&my_timer);
    printk("Exiting timer demo\n");
}

module_init(timer_demo_init);
module_exit(timer_demo_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lethe1203");
MODULE_DESCRIPTION("timer demo");