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