INIT_DELAYED_WORK()的分析及使用
程序员文章站
2022-06-03 23:00:05
...
- 应用场景
在中断中处理太多的操作是非常危险的,对中断的及时响应有很大的影响,在linux中我们经常会用到INIT_DELAYED_WORK,来处理中断需要响应的操作。 - 函数功能
工作队列(work queue)是Linux内核中将操作延期执行的一种机制。INIT_DELAYED_WORK()是一个宏 - 函数位置
\kernel\include\linux\workqueue.h - 函数分析
-
- 函数原型
#define INIT_DELAYED_WORK(_work, _func) \
__INIT_DELAYED_WORK(_work, _func, 0)
#define __INIT_DELAYED_WORK(_work, _func, _tflags) \
do { \
INIT_WORK(&(_work)->work, (_func)); \
__setup_timer(&(_work)->timer, delayed_work_timer_fn, \
(unsigned long)(_work), \
(_tflags) | TIMER_IRQSAFE); \
} while (0)
#ifdef CONFIG_LOCKDEP
#define __INIT_WORK(_work, _func, _onstack) \
do { \
static struct lock_class_key __key; \
\
__init_work((_work), _onstack); \
(_work)->data = (atomic_long_t) WORK_DATA_INIT(); \
lockdep_init_map(&(_work)->lockdep_map, #_work, &__key, 0); \
INIT_LIST_HEAD(&(_work)->entry); \
(_work)->func = (_func); \
} while (0)
#else
#define __INIT_WORK(_work, _func, _onstack) \
do { \
__init_work((_work), _onstack); \
(_work)->data = (atomic_long_t) WORK_DATA_INIT(); \
INIT_LIST_HEAD(&(_work)->entry); \
(_work)->func = (_func); \
} while (0)
#endif
-
- 函数分析
-
demo
#define READ_VDELAY 3000 //30S
struct xxx_device{
struct delayed_work xxx_delay_work;
};
static void read_work({struct work_struct *work)
{
struct xxx_device *bq = container_of(work,
struct xxx_device, read_work.work);
schedule_delayed_work(&bq->read_work,
READ_VDELAY );
}
probe
{
struct xxx_device *bq;
...
INIT_DELAYED_WORK(&bq->xxx_delay_work, read_work);
...
}
- 参考链接
http://blog.chinaunix.net/uid-28639221-id-5065472.html
https://blog.csdn.net/lcqlw123/article/details/46892147
上一篇: 22个HTML5 技巧二
下一篇: find_get_pid()