2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习
https://blog.csdn.net/qq_31339221/article/details/105057978https://blog.csdn.net/qq_31339221/article/details/105057978
·
一、在中断中处理太多的操作是非常危险的,对中断的及时响应有很大的影响,在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博客
更多推荐
已为社区贡献12条内容
所有评论(0)