linux驱动中定时器的使用

       在linux驱动中经常需要使用定时器,常见的使用为启动某项检查获取检测log等,此时会在proc/下增加相应的检测开关和时间域。如/proc/ctcwifi/diag_enable和/proc/ctcwifi/diag_duration,此时需支持diag_enable的读写,diag_duration的读写,当diag_enable写1时开始检测,检测时间为diag_duration,在检测时间内,或将检测日志保存到log,或将检测关键直接输出到串口。此时就需要使用linux定时器。

       linux内核专门提供了定时器的实现机制主要涉及一下几个函数:

1、初始化定时器:
    void init_timer(struct timer_list * timer);

 2、添加定时器:
    void add_timer(struct timer_list * timer);

 3、删除定时器:
    int del_timer(struct timer_list * timer);

       上面的定时器函数中都使用了struct timer_list,该结构体的定义在#include

struct timer_list
{
     struct list_head list;         //linux中对所有定时器实行链表管理,此为链表头结点
    unsigned long expires;        //定时器到期时间
    unsigned long data;          //此参数最后传入定时处理函数,类似于线程中的arg
    void (*function)(unsigned long);   //定时器超时执行函数
};

       下面提供一段代码实例(由于原有检测时间域和检测开关实现及检测处理方法不便于给出,现给出一般用法):

#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 ctcwifi_timer;           //定义一个定时器 

void  ctcwifi_diag_timeout(unsigned long arg)
{    
    printk("enter ctcwifi_diag_timeout function,
                    recv data %d from timer\n",arg);
    del_timer(&ctcwifi_timer);               //也可在exit函数中删除,两处选择一处
}

static int __init ctcwifi_diag_init(void)                 //驱动insmod时执行
{
    ptintk("enter ctcwifi_diag_init function\n");      
    init_timer(&ctcwifi_timer);                        //初始化定时器
    ctcwifi_timer.expires = jiffies + (100 * HZ);      //设定超时时间,100s 
    ctcwifi_timer.data = 300;                         //传递给定时器超时函数的值
    ctcwifi_timer.function = ctcwifi_diag_timeout;   //定时器超时执行函数
    add_timer(&ctcwifi_timer);                      //添加定时器

    return 0;
}

static void __exit ctcwifi_diag_exit(void)      //驱动rmmod时执行
{    
    del_timer(&ctcwifi_timer);         //卸载模块时,删除定时器,也可在超时函数中删除
    printk("enter ctcwifi_diag_exit function\n");
}

module_init(ctcwifi_diag_init);
module_exit(ctcwifi_diag_exit);

MODULE_AUTHOR("ZC");
MODULE_LICENSE("Dual BAD/GPL");
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核驱动定时器是一种常见的机制,可以在指定的时间间隔内触发断。它的主要作用是进行定时操作,如周期性地刷新屏幕、进行数据采集等。下面是一个简单的Linux内核驱动定时器断的代码示例: ``` #include <linux/timer.h> #include <linux/init.h> #include <linux/module.h> struct timer_list my_timer; void my_timer_callback(unsigned long data) { printk(KERN_INFO "my_timer_callback called (%ld).\n", jiffies); } static int __init timer_init(void) { int ret; printk(KERN_INFO "timer_init() called\n"); // 设置定时器 setup_timer(&my_timer, my_timer_callback, 0); ret = mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000)); // 定时1秒 if (ret) printk(KERN_ERR "Error in mod_timer\n"); return 0; } static void __exit timer_exit(void) { int ret; ret = del_timer(&my_timer); if (ret) printk(KERN_ERR "The timer is still in use...\n"); printk(KERN_INFO "timer_exit() called\n"); } module_init(timer_init); module_exit(timer_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Linux Timer Driver"); ``` 在上面的示例,我们定义了一个名为`my_timer`的定时器,并将其设置为1秒钟后触发断。当定时器到期时,它会调用`my_timer_callback()`函数来处理断。这个函数会输出一条信息,表明它已被调用。 上述示例只是一个简单的示例,实际上在Linux内核驱动使用定时器有许多不同的方法和实现方式。如果你需要更深入地了解Linux内核驱动定时器断代码,你可以查阅相关的文档或书籍,例如《Linux设备驱动开发详解》等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值