芯靈思Sinlinx A64開發(fā)板Linux內(nèi)核定時器編程

開發(fā)平臺 芯靈思Sinlinx A64

內(nèi)存: 1GB 存儲: 4GB

開發(fā)板詳細參數(shù) https://m.tb.cn/h.3wMaSKm

開發(fā)板交流群 641395230

Linux 內(nèi)核定時器是內(nèi)核用來控制在未來某個時間點(基于jiffies)調(diào)度執(zhí)行某個函數(shù)的一種機制眉撵,其實現(xiàn)位于 <Linux/timer.h> 和 kernel/timer.c 文件中缀遍。

內(nèi)核定時器的數(shù)據(jù)結(jié)構(gòu)

struct timer_list {
    struct list_head entry;  //雙向鏈表元素list:用來將多個定時器連接成一條雙向循環(huán)隊列。
    unsigned long expires; //expires 字段表示期望定時器執(zhí)行的 jiffies 值闻镶,到達該 jiffies 值時斥滤,將調(diào)用 function 函數(shù)将鸵,并傳遞 data 作為參數(shù)。
    void (*function)(unsigned long); //指向一個可執(zhí)行函數(shù)佑颇。當定時器到期時顶掉,內(nèi)核就執(zhí)行function所指定的函數(shù)。而data域則被內(nèi)核用作function函數(shù)的調(diào)用參數(shù)挑胸。
    unsigned long data;
    struct tvec_base *base;
    /* ... */
};

時間比較操作
在定時器應用中經(jīng)常需要比較兩個時間值痒筒,以確定timer是否超時,所以Linux內(nèi)核在timer.h頭文件中定義了4個時間關(guān)系比較操作宏茬贵。這里我們說時刻a在時刻b之后簿透,就意味著時間值a≥b。
Linux強烈推薦用戶使用它所定義的下列4個時間比較操作宏(include/linux/timer.h):

#define time_after(a,b) ((long)(b) - (long)(a) < 0)
#define time_before(a,b) time_after(b,a)
#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)
#define time_before_eq(a,b) time_after_eq(b,a)

Linux 內(nèi)核時間相關(guān)轉(zhuǎn)換函數(shù)

  1. unsigned long usecs_to_jiffies(const unsigned int u)
    功能: 把微秒轉(zhuǎn)換成時鐘節(jié)拍
    參數(shù): u 時間微秒
    返回: 對應的時鐘節(jié)拍數(shù)量
  2. unsigned long msecs_to_jiffies(const unsigned int m)
    功能: 把毫秒轉(zhuǎn)換成時鐘節(jié)拍
    參數(shù): u 時間毫秒
    返回: 對應的時鐘節(jié)拍數(shù)量
    示例: 要定時從現(xiàn)在開始解藻, 3 毫秒執(zhí)行一個函數(shù)
    expires 設(shè)置為 jiffies+ msecs_to_jiffies(3)

Linux 內(nèi)核定時器操作相關(guān) API

  1. 靜態(tài)定義結(jié)構(gòu)體變量并且初始化(宏)
    DEFINE_TIMER(_name, _function, _expires, _data)
    功能: 定義一個名字為_name 的 struct timer_list 結(jié)構(gòu)的變量老充, 并且初始化它的 function, expires, data 成員

  2. 定時器初始化(宏)
    init_timer(timer)
    功能: 只是對 struct timer_list 結(jié)構(gòu)成員進行一些基礎(chǔ)初始化操作, function, expires, data 成員還需要用戶自
    己填充舆逃。

3.設(shè)置定時器(宏)
setup_timer(timer, fn, data)
功能: 設(shè)置定時器中的 function, data 和一些基礎(chǔ)成員蚂维, expires 并沒有初始化, 需要用戶自己進行初始化

  1. 注冊定時器到內(nèi)核
    void add_timer(struct timer_list *timer)
    功能: 向內(nèi)核注冊一個定時器路狮, 注冊后會馬上開始計時虫啥。
    5.從內(nèi)核注銷定時器
    int del_timer(struct timer_list * timer);
    功能: 從內(nèi)核定時鏈表上刪除指定的定時器, 刪除后就不會再執(zhí)行綁定的函數(shù)

  2. 修改定時器定時時間值奄妨, 并且重新注冊
    int mod_timer(struct timer_list *timer, unsigned long expire0.s);
    功能: 修改定時器定時時間值涂籽, 并且重新注冊, 不管這個定時的超時函數(shù)是否執(zhí)行過砸抛。 執(zhí)行完成后會馬上啟
    動定時评雌。

內(nèi)核定時器編程步驟

Step1 定義timer_list 結(jié)構(gòu)變量
Step2 定義超時函數(shù)
Step3 對timer_list結(jié)構(gòu)變量進行初始化
Step4 注冊定時器树枫,啟動定時
Step5 注銷定時器

驅(qū)動代碼:

#include <linux/module.h>  
#include <linux/init.h>  
#include <linux/timer.h>  
  
//Step1 timer_list 結(jié)構(gòu)變量  
struct timer_list timer;  
//Step2 超時函數(shù)  
void timer_fun(long data)  
{  
        printk("%s is call! data:%d\r\n",__FUNCTION__,data);//__FUNCTION__   獲取當前函數(shù)名  
        mod_timer(&timer, jiffies + HZ*1); //再次修改本定時器超時時間為當前時間后1秒  
}  
static int __init timer_init(void)  
{  
        //Step3 對timer_list結(jié)構(gòu)變量進行初始  
        init_timer(&timer);  
        setup_timer(&timer, timer_fun, 666);  
        timer.expires = jiffies + HZ*2;  
        //Step4 注冊定時器,啟動定時  
        add_timer(&timer);  
        printk("Timer start!\r\n");  
        return 0;  
}  
static void __exit timer_exit(void) //Module exit function specified by module_exit()  
{  
        //Step5 注銷定時器  
        del_timer_sync(&timer);  
        printk("Timer over!\r\n");  
}  
module_init(timer_init);  
module_exit(timer_exit);  
MODULE_LICENSE("GPL"); 

Makefile代碼:

KERN_DIR = /work/lichee/linux-3.4  
all:  
        make -C $(KERN_DIR) M=`pwd` modules  
clean:  
        make -C $(KERN_DIR) M=`pwd` modules clean  
        rm -rf modules.order  
obj-m        += timer_drv.o  

最后使用 dmseg 命令查看景东,可以看到每隔1秒打印一次


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砂轻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斤吐,更是在濱河造成了極大的恐慌搔涝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件和措,死亡現(xiàn)場離奇詭異庄呈,居然都是意外死亡,警方通過查閱死者的電腦和手機派阱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門诬留,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贫母,你說我怎么就攤上這事文兑。” “怎么了颁独?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵彩届,是天一觀的道長。 經(jīng)常有香客問我誓酒,道長樟蠕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任靠柑,我火速辦了婚禮寨辩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歼冰。我一直安慰自己靡狞,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布隔嫡。 她就那樣靜靜地躺著甸怕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腮恩。 梳的紋絲不亂的頭發(fā)上梢杭,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音秸滴,去河邊找鬼武契。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的咒唆。 我是一名探鬼主播届垫,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼全释!你這毒婦竟也來了装处?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浸船,失蹤者是張志新(化名)和其女友劉穎符衔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糟袁,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年躺盛,在試婚紗的時候發(fā)現(xiàn)自己被綠了项戴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡槽惫,死狀恐怖周叮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情界斜,我是刑警寧澤仿耽,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站各薇,受9級特大地震影響项贺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峭判,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一开缎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧林螃,春花似錦奕删、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至横漏,卻和暖如春谨设,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绊茧。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工控妻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留装获,地道東北人盯蝴。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓京髓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宜猜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容