Linux驅動開發 9 Linux定時器

2021-07-10 17:38:29 字數 4375 閱讀 7424

1.定時器是對機器時鐘中斷的應用 -

2.核心提供一組資料結構來完成定時觸發工作或者完成週期性的事務

3.作業系統中,一般不允許使用for

迴圈來延時,一般使用定時器來完成延時功能

4.jiffies 表當前時間,

hz表示延遲1s

5.資料結構

struct timer_list ;

6.相關函式

a) 初始化定時器

法一:#define init_timer(timer)\

init_timer_key((timer), null, null)

void init_timer_key(struct timer_list *timer, const char *name,struct lock_class_key *key)

debug_init(timer);

__init_timer(timer, name, key);

static void __init_timer(struct timer_list *timer,const char *name,struct lock_class_key *key)

timer->entry.next = null;

timer->base = __raw_get_cpu_var(tvec_bases);

timer->slack = -1;

lockdep_init_map(&timer->lockdep_map, name, key, 0);

注:init_timer()

巨集初始化

timer_list

結構體entry

成員的next

為空,並給

base

指標賦值

法二:下面這個巨集也可以用來初始化:給定時器結構體的成員賦值

timer_initializer(_function, _expires, _data)

給定時器結構底成員賦值的快捷方式

#define define_timer(_name, _function, _expires, _data) \

struct timer_list _name = \在這裡幫我們定義了結構體,所以快捷

timer_initializer(_function, _expires, _data)

法三:最後一種方法用於初始化定時器斌為成員賦值

#define setup_timer(timer, fn, data) \

do while (0)

b) 新增定時器(註冊核心定時器)

void add_timer(struct timer_list *timer);

c) 刪除定時器

int del_timer(struct timer_list *timer)

d) 修改定時器---

修改定時的超時時間

expires

int mod_timer(struct timer_list *timer, unsigned long expires)

/*裝置結構體*/

struct ***_dev

struct miscdevices misc;

timer_list ***_timer; /*裝置具有的定時器*/

/*定時器處理函式

,實現週期執行*/

static void ***_do_timer(unsigned long arg)

struct ***_dev *dev = (struct ***_dev *)arg /*迴圈載入,相互轉換*/

/*排程定時器再執行*/

dev->***_timer.expires = jiffies + delay;

add_timer(&(dev->timer));

/*驅動中的某函式*/

***_func1(...)

struct ***_dev *dev = filp->private_data;/*使用檔案結構的

private_data

傳遞結構*/

/*初始化定時器*/

init_timer(&(dev->***_timer)); /*注意取得是定時器的指標*/

dev->***_timer.function = ***_do_timer;

dev->***_timer.data = (unsigned long)dev; /*將結構體的引數傳遞給超時處理函式*/

/*設定延時,註冊定時器*/

dev->***_timer.expires = jiffies + delay;

add_timer(&dev->***_timer);

/*驅動中的某函式*/

***_func2(...)

/*刪除定時器*/

del_timer(&(dev->***_timer));

/******************************************

author : hntea

date: 2016/3/15

function :

1.檢測按鍵中斷

2.在中斷底半部交個

tasklet處理

3.外部中斷0的

tasklet

任務啟動定時器

4.定時器列印訊息

******************************************/

#include "key_hard.h"

/******************************************

定時器操作

******************************************/

/*建立乙個定時器*/

struct timer_list key_timer;

/*定時器處理函式

,實現週期執行*/

static void key_do_timer(unsigned long data)

/******************************************

函式名: key_open

函式功能:檔案操作

******************************************/

int  key_open(struct inode *inode, struct file *filp)

/******************************************

函式名:

函式功能:檔案操作

******************************************/

struct file_operations key_fop =

;struct miscdevice key=

;/******************************************

中斷底半部用任務實現

******************************************/

/*定義

task */

struct tasklet_struct key1_task;

struct tasklet_struct key2_task;

void key1_taskfun(unsigned long x)

void key2_taskfun(unsigned long x)

/*關聯結構體和服務函式*/

declare_tasklet(key1_task,key1_taskfun,1);

declare_tasklet(key2_task,key2_taskfun,2);

/******************************************

函式功能:中斷服務函式入口

******************************************/

static irqreturn_t key1_interrupt (int irq, void *dev_id)

static irqreturn_t key2_interrupt (int irq, void *dev_id)

/**********************************

函式名:

函式功能:初始化函式

**********************************/

static int keyinit(void)

static void keyexit(void)

module_license("gpl");

module_author("hntea");

module_init(keyinit);

module_exit(keyexit);

9 Linux多執行緒

linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。編寫linux下的多執行緒程式,需要使用標頭檔案pthread.h,連線時需要使用庫libpthread.a。gcc lpthread helloworld.c o helloworld include int pthread ...

Linux筆記 9 Linux網路概述

linux網路概述 一 linux網路優勢 linux為使用者提供了完善的 強大的網路功能。1,完善的內建網路。其他作業系統不包含如此緊密地和核心結合在一起的網路部分。2,linux 免費提供了大量支援 internet 的軟體,internet 是在 unix 領域中 建立並繁榮起來的,在這方面使...

linux驅動開發

這兩天在公司由於一直沒有太過於繁重的任務,於是便給分配了驅動開發的任務,之前一直不明白驅動開發和普通的嵌入式開發到底有什麼區別,然後有沒有經過系統的學習,於是就一直愣在那裡。不過慢慢的還是經過查資料,雖然 沒有編寫出來,但是對於系統的一些東西學習的終於有了一定的了解,感覺這個十分的重要,也為了給自己...