嵌入式Linux系統 「核心定時器」

2021-07-31 03:06:06 字數 2779 閱讀 1091

linux 下的核心定時器:類似微控制器中的定時器中斷

1.涉及函式

1. 初始化定時器佇列結構 init_timer(&buttons_timer);//

2. 定時器超時函式 buttons_timer.function = buttons_timer_function; //

3.或者初始化定時器和超時函式作為一步(data作為fn的引數) setup_timer(timer, fn, data) //

4. 新增定時器 add_timer(&buttons_timer); //

5. 設定定時器超時時間 1\100 s(修改一次超時時間只會觸發一次定時器)mod_timer(&buttons_timer, jiffies+hz/100); //

6.刪除定時器 del_timer(&timer);

注意:乙個定時器只能使用一次,要想多次使用,必須在呼叫處理函式時,修改時間,再次呼叫。

例程如下:

使用時一般使用巨集來例化:

struct timer_list my_timer; 函式外部定義mu_timer的定時器

函式內部使用以下函式來初始化該定時器:

1. init_timer(&my_timer);

2. my_timer.expires = jiffies + hz;

3. my_timer.function = my_timer_hander;

4 . add_timer(&my_timer);

特別注意第二條:hz在其他模組中定義為1000.表示表示一秒的定時;若你想設定為1ms;則(my_timer.expires = jiffies + hz/1000;)

如果要多次執行定時器:

就在my_timer_hander()中;修改定時器的值

mod_timer(&my_timer, jiffies + hz);//hz為1秒,在此時間之後繼續執行

所使用的標頭檔案為:

#include<

linux

/timer.h> (有些系統中沒有,不加也可以)

#include

下面為乙個一秒閃爍一次小等定時器(以字元驅動為例)

基於jz2440 v3 開發板:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

static struct class *firstdrv_class;

static struct class_device *firstdrv_class_dev;

volatile unsigned long *gpfcon = null;

volatile unsigned long *gpfdat = null;

struct timer_list my_timer;

void my_timer_hander(unsigned long num)

else

}

static int first_drv_open(struct inode *inode, struct file *file)

static struct file_operations first_drv_fops = ;

int major;

static int first_drv_init(void)

static void first_drv_exit(void)

module_init(first_drv_init);

module_exit(first_drv_exit);

module_license("gpl");

下面是測試程式:

static int first_drv_open(struct inode *inode, struct file *file)

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

else

*/

return 0; }

static struct file_operations first_drv_fops = ;

int major;

static int first_drv_init(void)

static void first_drv_exit(void)

module_init(first_drv_init);

module_exit(first_drv_exit);

module_license("gpl");

測試程式:

#include

#include

#include

#include

/* firstdrvtest on

* firstdrvtest off */

int main(int argc, char **argv)

return 0; }

總結:

可以實現小燈一秒一次閃爍

剛開始不閃爍,以為是驅動問題,後來發現其實時my_timer_hander()中的val變數未被定義為static型別,所以每次進入函式都為0,導致不閃爍。

總體來說,核心定時器是比較簡單的。

Linux嵌入式 核心 核心定時器

1.度量時間差 時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 即頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台,預設值為1000 每秒計數1000次 每當時鐘中斷發生時,全域性變數jiffies unsigned long 就加1,因此j...

嵌入式 定時器中斷

先上 include void init void main void init void timer0 interrupt 1 示例 就要有示例 的樣子,簡簡單單的才能把問題說清楚!先解釋下幾個變數,tmod,th0,tl0,et0,ea,tr0,這些變數不是我定義的,而是標頭檔案中的,先掌握用法...

嵌入式linux之定時器防抖

總的來說,timer的用法還是很簡單的。主要需要定義乙個timer list變數timer 先初始化timerinit timer timer then 對timer的相關引數賦值 timer.function fun timer.expires jiffies timer delay add ti...