linux驱动中使用定时器的设置

Linux的内核中定义了一个定时器的结构:

#include<linux/timer.h>
struct timer_list
 {
    struct list_head list;
unsigned long expires; //定时器到期时间
unsigned long data; //作为参数被传入定时器处理函数
void (*function)(unsigned long);
};
例如要定义这个结构使用可以这样: struct timer_list testtimer;(testtimer可随意命名)

利用这个结构我们可以在驱动中很方便的使用定时器。

一: timer的API函数:
初始化定时器:
void init_timer(struct timer_list * timer);
增加定时器:
void add_timer(struct timer_list * timer);
删除定时器:
int del_timer(struct timer_list * timer);
修改定时器的expire:
int mod_timer(struct timer_list *timer, unsigned long expires);
 二:使用定时器的一般流程为:
(1)创建timer、编写超时定时器处理函数function;
(2)为timer的expires、data、function赋值;
(3)调用add_timer将timer加入列表;
(4)在定时器到期时,function被执行;
(5)在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。

下面是我写的一个demo程序,每隔一秒执行testtimer_czd一次,执行打印一次:

	#include <linux/module.h>
	#include <linux/kernel.h>
	#include <linux/init.h>
	#include <linux/sched.h>//jiffies在此头文件中定义
	#include <linux/init.h>
	#include <linux/timer.h>

	struct timer_list testtimer;//定义一个定时器

	void testtimer_czd(unsigned long arg)
	{
        printk("My testtimer is ok\n");
        printk("receive data from timer is: %ld\n",arg);

	/*如果不添加以下三行代码,则只会执行一次上面的两行打印 */
        testtimer.expires = jiffies+100;//设定超时时间,100代表1秒
        testtimer.function = testtimer_czd;//设置定时器超时函数
        add_timer(&testtimer); //添加定时器,定时器开始生效
	   }

	static int __init testtimer_init (void)
	{
        printk("my testtimer init\n");
        init_timer(&testtimer);     //初始化定时器
        testtimer.expires = jiffies+100;//设定超时时间,100代表1秒
        testtimer.data = 111;    //传递给定时器超时函数的值
        testtimer.function = testtimer_czd;//设置定时器超时函数
        //(注:以上3步可以用函数 setup_timer(&mytime, func_exec_timer , datap)代替,该函数实现赋值并初始化定时器 )
        //setup_timer(&testtimer, testtimer_czd, data);
        add_timer(&testtimer); //添加定时器,定时器开始生效
        return 0;
	}

	static void __exit testtimer_exit (void)

	{
        del_timer(&testtimer);//卸载模块时,删除定时器
        printk("testtimer module exit\n");
	}

	module_init(testtimer_init);
	module_exit(testtimer_exit);
	
	MODULE_AUTHOR("czd>");
	MODULE_DESCRIPTION("testtimer Driver");
	MODULE_LICENSE("GPL");

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零意@

您的打赏将是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值