zoukankan      html  css  js  c++  java
  • linux内核定时器

    今天参考linux驱动开发详解,照抄了一份second的程序,用到了timer。

    总的来说,timer的用法还是很简单的。主要需要定义一个timer_list变量timer、
    先初始化timer
    init_timer(&timer);
    then 对timer的相关参数赋值:
    timer.function = fun;
    timer.expires = jiffies + TIMER_DELAY;

    add_timer(&timer);
    在定时器时间到的时候,会执行fun,如果继续定时,可以通过
    在fun中执行
    mod_timer(&timer, jiffies + TIMER_DELAY);

    在不需要的时候通过调用
    del_timer(&timer);
    删除定时器。

    简单吧。这样一个简单的定时器就完成了。
    呵呵。

    附程序:
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define SECOND_MAJOR 0

    static int second_major = SECOND_MAJOR;

    struct second_dev
    {
        struct cdev cdev;
        atomic_t counter;
        struct timer_list s_timer;
    };

    struct second_dev *second_devp;

    static void second_timer_handle(unsigned long arg)
    {
        mod_timer(&second_devp->s_timer, jiffies + HZ);
        atomic_inc(&second_devp->counter);
       
        printk(KERN_ERR "current jiffies is %ld ",jiffies);
    }

    int second_open(struct inode *inode, struct file *filp)
    {
      init_timer(&second_devp->s_timer);
      second_devp->s_timer.function = &second_timer_handle;
      second_devp->s_timer.expires = jiffies + HZ;
     
      add_timer(&second_devp->s_timer);
      atomic_set(&second_devp->counter, 0);
      return 0;   
    }

    int second_release(struct inode *inode, struct file *filp)
    {
        del_timer(&second_devp->s_timer);
       
        return 0;
    }
    static ssize_t second_read(struct file *filp, char __user *buf, size_t count,
      loff_t *ppos)
    {
        int counter;
       
        counter = atomic_read(&second_devp->counter);
        if (put_user(counter, (int *)buf))
        {
            return -EFAULT;
        }else
        {
            return sizeof(unsigned int);
        }
       
    }

    static const struct file_operations second_fops =
    {
        .owner = THIS_MODULE,
        .open = second_open,
        .release = second_release,
        .read = second_read,
    };
    static void second_setup_cdev(struct second_dev *dev, int index)
    {
        int err, devno = MKDEV(second_major, index);
        cdev_init(&dev->cdev, &second_fops);
        dev->cdev.owner = THIS_MODULE;
        dev->cdev.ops = &second_fops;
        err = cdev_add(&dev->cdev, devno, 1);
        if (err)
        {
            printk(KERN_NOTICE "Error %d add second%d", err, index);
        }
    }
    int second_init(void)
    {
        int ret;
        dev_t devno = MKDEV(second_major, 0);
       
        if (second_major)
        {
            ret = register_chrdev_region(devno, 1, "second");
        }else
        {
            ret = alloc_chrdev_region(&devno, 0, 1, "second");
            second_major = MAJOR(devno);
        }
        if (ret < 0)
        {
            return ret;
        }
       
        second_devp = kmalloc(sizeof(struct second_dev), GFP_KERNEL);
        if (!second_devp)
        {
            ret = -ENOMEM;
            goto fail_malloc;
        }
       
        memset(second_devp, 0, sizeof(struct second_dev));
       
        second_setup_cdev(second_devp, 0);
       
        return 0;

      fail_malloc:
          unregister_chrdev_region(devno, 1);
    }

    void second_exit(void)
    {
        cdev_del(&second_devp->cdev);
        kfree(second_devp);
        unregister_chrdev_region(MKDEV(second_major, 0), 1);
    }

    MODULE_AUTHOR("Song Baohua");
    MODULE_LICENSE("Dual BSD/GPL");

    module_param(second_major, int, S_IRUGO);

    module_init(second_init);
    module_exit(second_exit);

    附上用户端的测试程序:
    #include
    #include
    #include

    int main(void)
    {
        int fd, i;
        int data;
        fd = open("/dev/second",O_RDONLY);
        if (fd < 0)
        {
            printf("open /dev/second error ");
        }
        for(i = 0; i < 20; i++)
        {
          read(fd, &data, sizeof(data));
          printf("read /dev/second is %d ",data);
          sleep(1);
           }
        close(fd);
    }

  • 相关阅读:
    容器适配器————priority_queue
    容器适配器————queue
    容器适配器之总结
    序列式容器之总结
    序列式容器————forward_list
    序列式容器————list
    序列式容器————dequeue
    13.软件项目管理与敏捷方法——如何变更职责笔记
    10.软件项目管理与敏捷方法——沟通管理笔记
    09.软件项目管理与敏捷方法——人力资源管理笔记
  • 原文地址:https://www.cnblogs.com/flintlovesam/p/5783976.html
Copyright © 2011-2022 走看看