搜尋
首頁系統教程LinuxLinux核心定時器與延遲工作驅動開發詳解

Linux核心定時器與延遲工作驅動開發詳解

Feb 13, 2024 am 11:57 AM
linuxlinux教程linux系統linux指令shell腳本typedefoverflow嵌入式linuxlinux入門linux學習

Linux核心定時器與延遲工作是兩種常用的實現定時任務和延遲執行任務的機制,它們可以讓驅動程式在適當的時間點執行特定的函數,以適應硬體設備的需求和特性。但是,如何正確地使用Linux內核定時器與延遲工作呢?本文將從理論與實務兩方面,介紹Linux核心定時器與延遲工作驅動發展的基本知識與技巧,以及一些常見的問題與解決方法。

Linux核心定時器與延遲工作驅動開發詳解

#核心定時器

#軟體上的定時器最終要依靠硬體時鐘來實現,簡單的說,內核會在時鐘中斷發生後檢測各個註冊到內核的定時器是否到期,如果到期,就回調相應的註冊函數,將其作為中斷底半部來執行。實際上,時脈中斷處理程序會觸發TIMER_SOFTIRQ軟中斷,運行目前處理器上到期的所有計時器。
設備驅動程式如要取得時間資訊以及需要定時服務,都可以使用核心定時器。

jiffies

#要說內核定時器,首先就得說說內核中關於時間的一個重要的概念:jiffies變數,作為內核時脈的基礎,jiffies每隔一個固定的時間就會增加1 ,稱為增加一個節拍,這個固定間隔由定時器中斷來實現,每秒中產生多少個定時器中斷,由在中定義的HZ宏來確定,如此,可以透過jiffies取得一段時間,例如jiffies/HZ表示自系統啟動的秒數。下兩秒就是(jiffies/HZ 2),核心中用jiffies來計時,秒轉換成的jiffies:seconds*HZ,所以以jiffiy為單位,以當前時刻為基準計時2秒:( jiffies/HZ 2)*HZ=jiffies 2*HZ如果要取得目前時間,可以使用**do_gettimeofday()**,該函式填入一個struct timeval結構,有著接近微妙的解析度。

//kernel/time/timekeeping.c
 473 /**
 474  * do_gettimeofday - Returns the time of day in a timeval
 475  * @tv:         pointer to the timeval to be set
 476  *
 477  * NOTE: Users should be converted to using getnstimeofday()
 478  */
 479 void do_gettimeofday(struct timeval *tv)   

驅動程式為了讓硬體有足夠的時間完成一些任務,常常需要將特定的程式碼延後一段時間來執行,根據延時的長短,在核心開發中使用長延時短延時兩個概念。長延時的定義為:延時時間>多個jiffies,實作長延時可以用查詢jiffies的方法:

time_before(jiffies, new_jiffies);
time_after(new_jiffiesmjiffies);

**短延時的定義為:延遲事件接近或短於一個jiffy,實作短延時可以呼叫

udelay();
mdelay();

這兩個函數都是忙等待函數,大量消耗CPU時間,前者使用軟體循環來延遲指定數目的微妙數,後者使用前者的嵌套來實現毫秒級的延時。

定時器

#驅動程式可以註冊一個核心計時器,來指定一個函數在未來某個時間來執行。定時器從註冊到核心開始計時,達到指定的時間後會執行註冊的函數。即超時值是一個jiffies值,當jiffies值大於timer->expires時,timer->function就會被執行。 API如下

//定一个定时器
struct timer_list my_timer;

//初始化定时器
void init_timer(struct timer_list *timer);
mytimer.function = my_function;
mytimer.expires = jiffies +HZ;

//增加定时器
void add_timer(struct timer_list *timer);

//删除定时器
int del_tiemr(struct timer_list *timer);

實例

static struct timer_list tm;
struct timeval oldtv;

void callback(unsigned long arg)
{
    struct timeval tv;
    char *strp = (char*)arg;
    do_gettimeofday(&tv);
    printk("%s: %ld, %ld\n", __func__,
        tv.tv_sec - oldtv.tv_sec,
        tv.tv_usec- oldtv.tv_usec);
    oldtv = tv;
    tm.expires = jiffies+1*HZ;
    add_timer(&tm);
}

static int __init demo_init(void)
{
    init_timer(&tm);
    do_gettimeofday(&oldtv);
    tm.function= callback;
    tm.data    = (unsigned long)"hello world";
    tm.expires = jiffies+1*HZ;
    add_timer(&tm);
    return 0;
}

延遲工作

除了使用核心計時器完成定時延遲工作,Linux核心還提供了一套封裝好的」捷徑」-delayed_work,和核心定時器類似,其本質也是利用工作佇列和定時器實現,

//include/linux/workqueue.h
100 struct work_struct {           
101         atomic_long_t data;
102         struct list_head entry;
103         work_func_t func;
104 #ifdef CONFIG_LOCKDEP
105         struct lockdep_map lockdep_map;
106 #endif
107 };
113 struct delayed_work {              
114         struct work_struct work;
115         struct timer_list timer;
116 
117         /* target workqueue and CPU ->timer uses to queue ->work */
118         struct workqueue_struct *wq;
119         int cpu;
120 };

#

struct work_struct
–103–>需要延迟执行的函数, typedef void (work_func_t)(struct work_struct work);

至此,我们可以使用一个delayed_work对象以及相应的调度API实现对指定任务的延时执行

//注册一个延迟执行
591 static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay)
//注销一个延迟执行
2975 bool cancel_delayed_work(struct delayed_work *dwork)    

和内核定时器一样,延迟执行只会在超时的时候执行一次,如果要实现循环延迟,只需要在注册的函数中再次注册一个延迟执行函数。

schedule_delayed_work(&work,msecs_to_jiffies(poll_interval));

本文从理论和实践两方面,详细介绍了Linux内核定时器与延迟工作驱动开发的基本知识和技巧。我们首先了解了Linux内核定时器与延迟工作的概念、原理、特点和API函数,然后学习了如何使用Linux内核定时器与延迟工作来实现按键事件的检测和处理。最后,我们介绍了一些在Linux内核定时器与延迟工作驱动开发过程中可能遇到的问题,以及相应的解决方法。

通过本文,我们希望能够帮助你掌握Linux内核定时器与延迟工作驱动开发的基本方法和技巧,为你在嵌入式Linux领域的进一步学习和工作打下坚实的基础。

以上是Linux核心定時器與延遲工作驅動開發詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
如何學習Linux基礎知識?如何學習Linux基礎知識?Apr 10, 2025 am 09:32 AM

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux最有用的是什麼?Linux最有用的是什麼?Apr 09, 2025 am 12:02 AM

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

Linux的缺點是什麼?Linux的缺點是什麼?Apr 08, 2025 am 12:01 AM

Linux的缺點包括用戶體驗、軟件兼容性、硬件支持和學習曲線。 1.用戶體驗不如Windows或macOS友好,依賴命令行界面。 2.軟件兼容性不如其他系統,缺乏許多商業軟件的原生版本。 3.硬件支持不如Windows全面,可能需要手動編譯驅動程序。 4.學習曲線較陡峭,掌握命令行操作需要時間和耐心。

Linux難以學習嗎?Linux難以學習嗎?Apr 07, 2025 am 12:01 AM

Linuxisnothardtolearn,butthedifficultydependsonyourbackgroundandgoals.ForthosewithOSexperience,especiallycommand-linefamiliarity,Linuxisaneasytransition.Beginnersmayfaceasteeperlearningcurvebutcanmanagewithproperresources.Linux'sopen-sourcenature,bas

Linux的5個基本組件是什麼?Linux的5個基本組件是什麼?Apr 06, 2025 am 12:05 AM

Linux的五個基本組件是:1.內核,管理硬件資源;2.系統庫,提供函數和服務;3.Shell,用戶與系統交互的接口;4.文件系統,存儲和組織數據;5.應用程序,利用系統資源實現功能。

Ubuntu Home Automation:使用開源工具建立智能的居住空間Ubuntu Home Automation:使用開源工具建立智能的居住空間Apr 05, 2025 am 09:19 AM

開啟智能家居新篇章:基於Ubuntu的開源家庭自動化系統 智能家居技術徹底改變了我們與生活空間的互動方式,為日常生活帶來了便利、安全和能源效率。從遠程控制燈光和電器,到監控安全攝像頭和自動化氣候控制,智能家居技術變得越來越普及。 然而,許多商業智能家居系統存在局限性:高昂的成本、隱私問題以及有限的兼容性。幸運的是,開源軟件解決方案結合Ubuntu的強大功能,提供了一種替代方案——允許用戶創建可定制、經濟高效且安全的智能家居生態系統。 本指南將探討如何使用Ubuntu和開源工具設置家庭自動化系統。

Linux vs. Windows:什麼是2025年的差異?Linux vs. Windows:什麼是2025年的差異?Apr 05, 2025 am 09:05 AM

Linux與Windows:2025比較 考慮從MacOS或Windows切換? Linux可能是答案。 儘管MacOS用戶會發現相對平滑的過渡(由於MacOS的UNIX Core),但Windows用戶需要適應。此指南HIG

什麼是Linux設備?什麼是Linux設備?Apr 05, 2025 am 12:04 AM

Linux設備是運行Linux操作系統的硬件設備,包括服務器、個人電腦、智能手機和嵌入式系統。它們利用Linux的強大功能執行各種任務,如網站託管和大數據分析。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用