Linux 定時器的簡單使用

主要記錄定時器的簡單使用,先上代碼:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/device.h>
#include <linux/ioctl.h>
#include <linux/err.h>
#include <linux/list.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/compat.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/irq.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/clk-provider.h>
#include <linux/clk/ti.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
//因爲是從寫好的驅動裏面把定時器提取出來進行記錄,所以頭文件包含了很多用不到的頭文件

#define DEV_NAME	"timer_test"
#define TIMER_TIMEOUT_VALUE	1

struct timer_list timer;    //聲明一個定時器變量
int major;

//定時器超時響應函數
void timer_function(unsigned long arg)
{
    mod_timer(&timer, jiffies+TIMER_TIMEOUT_VALUE); //重新設定超時時間,不然不會再執行
    printk("this is timer_function !\n");
    return ;
}


static int __init mod_init(void)
{
	int ret;
	init_timer(&timer);													//初始化定時器	
	timer.expires = jiffies+TIMER_TIMEOUT_VALUE;                        //設置超時時間
	timer.function = timer_function;
	add_timer(&timer);                //添加定時器,這個應該就是啓動定時器
	return 0; 
}
module_init(mod_init);

static void __exit mod_exit(void)
{
	del_timer(&timer);                //刪除定時器
	printk("############### %s  %s !kernel\n", __FILE__, __func__);
}
module_exit(mod_exit);


MODULE_AUTHOR("lqd");
MODULE_LICENSE("GPL");

關於Linux定時器,有兩點總結如下:

1、超時時間的基數時間:之前對於這個基數時間的理解,一直有點理解不了,之前看別人寫的都是HZ,對於這個HZ的意思,說實話,現在也不是很理解。我把HZ理解程序1秒的時鐘週期。這個值和系統的時鐘設置有關,具體的作用,還沒有理解透徹。這個值一般是100或者1000.可以手動進行更改。如果HZ=100,那麼jiffies每10ms進行一次加1,如果HZ=1000,那麼jiffies每1ms進行一次加1。jiffies是一個全局變量,它隨着時間不斷的增加

2、定時器的理解:定時器與其說是定時器,我覺得把它理解爲一個鬧鐘更合適:jiffies表示當前的時間,expires表示鬧鐘提示的時間。比如:當HZ=1000時,jiffies當前是100,expires=jiffies+10,那麼其意思就是:鬧鐘設置成10ms後鬧鈴。

注意:

1、設置超時時間的基本單位是根據HZ的值來決定的。

2、設置定時器的超時時間最好是通過HZ計算得到的。不然HZ的值發送變化後,你之前驅動的定時就存在問題。這就是被人爲什麼寫的都是HZ的原因

3、這裏舉例的定時,不是很準確,誤差比較大。一般用作秒單位的超時。ms單位,誤差較大。(如果有大佬知道怎麼通過這個定時器實現ms的精確定時,請指導一下)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章