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...