zoukankan      html  css  js  c++  java
  • 7、linux之定时器

    (1) 一个timer_list 结构体的实例对应一个定时器,其定义如下:

    struct timer_list {
    struct list_head entry, /*定时器列表*/
    unsigned long expires, /*定时器到期时间*/
    void (*function) (unsigned long), /*定时器处理函数*/
    unsigned long data,/*作为参数被传入定时器处理函数*/
    struct timer_base_s *base,
    ...
    };

    (2) 初始化定时器

    void init_timer (struct timer_list *timer);
    TIMER_INITIALIZER (_function, _expires, _data)
    DEFINE_TIMER (_name, _function, _expires, _data)
    setup_timer ();

    (3) 增加定时器

    void add_timer (struct timer_list *timer);

    (4) 删除定时器

    int del_timer (struct timer_list *timer);

    (5) 修改定时器的expire

    int mod_timer (struct timer_list *timer, unsigned long expires);

    (6) 对于周期性的任务,linux内核还提供了一种delayed_work机制来完成,本质上用工作队列和定时器实现。

    驱动中定时器模块:

    //设备结构体

    struct xxx_dev{
    struct cdev cdev;
    ...
    struct timer_list xxx_timer;//定义定时器
    }
    //驱动中某函数
    xxx_funcl(...)
    {
    struct xxx_dev *dev = filp->private_data;
    ...
    //初始化定时器
    init_timer(&dev->xxx_time);
    dev->xxx_timer.function = &xxx_do_timer;//定义定时器处理函数
    dev->xxx_timer.data = (unsigned long)dev;//设备结构体指针作为定时器处理参数
    dev->xxx_timer.expires = jiffies + delay;//定义到期时间
    add_timer(&dev->xxx_timer);//注册定时器
    ...
    }
    //驱动中某函数
    xxx_func2(...)
    {
    ...
    //删除中断
    del_timer(&dev->xxx_timer);
    ...
    }
    //定时器处理函数
    static void xxx_do_timer(unsigned long arg)
    {
    struct xxx_dev *dev = filp->private_data;
    ...
    dev->xxx_timer.expires = jiffies + delay;//重新设置定时时间
    add_timer(&dev->xxx_timer);
    ...
    }
  • 相关阅读:
    [已解决] Python logging 重复打印日志信息
    scrapy
    Python 元编程
    MySQL性能优化 分区
    SQL Mode
    Golang 接口
    Python partial
    栈、队列(链表实现)
    Golang 位向量
    Java50题——学习以及思考
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8546555.html
Copyright © 2011-2022 走看看