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

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

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

三、相关函数        

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、

2、

3、

4、

六、参考文章:

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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值