2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习

一、在中断中处理太多的操作是非常危险的,对中断的及时响应有很大的影响,在linux中我们经常会用到INIT_DELAYED_WORK,仔细看里面会有个定时器,用队列的形式来处理中断下半部分需要响应的操作。

二、函数原型kernel\include\linux\workqueue.h

2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习_第1张图片

三、相关函数        

1、定义一个新的数据结构delayed_work用于处理延迟执行:

               struct delayed_work {
                        struct work_struct work;

                        struct timer_list timer;

               };

2、在工作队列中被调用的函数原形如下:

               typedef void (*work_func_t)(struct work_struct *work);

3、初始化数据结构

               INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func)

4、提交任务到工作队列

              int schedule_delayed_work(struct delayed_work *work, unsigned long delay);

5、删除提交到工作队列的任务

              int cancel_delayed_work(strcut delayed_work *work);

6、刷新默认工作队列(常跟cancle_delayed_work一起使用)

              void flush_schedlue_work(void);

四、简单的demo

struct  xxx_t {
    spinlock_t                    lock;
    void __iomem                  *base;
    struct platform_device        *pdev;
    struct delayed_work           xxx_delayed_work;
    struct workqueue_struct       xxx_workqueue;
    unsigned long                 timeout;
};

       
static void xxx_mond(struct work_struct *work)

{
    struct xxx_t *xxx  = container_of(work, struct xxx_t, xxx_delayed_work.work);
    ........
    schedule_delayed_work(&xxx->xxx_delayed_work, msecs_to_jifies(xxx->timeout*HZ));

}

static int __devinit   xxx_probe(struct platform_device *pdev)

{
    struct xxx_t *xxx  = container_of(pdev, struct xxx_t, pdev);
    ......
    INIT_DELAYED_WORK(&xxx->xxx_delayed_work, xxx_mond);
    schedule_delayed_work(&xxx->xxx_delayed_work, 0);
}

五、在ethernet中的应用,定时通过MIIM接口read PHY寄存器,MII接口是MAC与PHY连接的标准接口.因为各厂家采用了同样的接口,用户可以根据所需的性能、价格,采用不同型号,甚至不同公司的phy芯片.需要发送的数据通过MII接口中的收发两组总线实现.而对PHY芯片寄存器的配置信息,则通过MII总的一组串口总线实现,即MIIM(MII Management).

1、

2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习_第2张图片

2、

2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习_第3张图片

3、

2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习_第4张图片

4、

2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习_第5张图片

六、参考文章:

https://www.cnblogs.com/yyg-cn/p/17163455.html

https://www.cnblogs.com/youngerchina/archive/2011/12/23/5624642.html

Linux内核工作队列(workqueue)详解_linux 工作队列_咸鱼弟的博客-CSDN博客

INIT_DELAYED_WORK()的分析及使用_5念since的博客-CSDN博客

 https://blog.csdn.net/peijian1998/article/details/8717490?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

你可能感兴趣的:(Android,Linux学习,linux,学习,运维)