INIT_DELAYED_WORK()の分析と使用

  • アプリケーションシナリオ
    割り込みで非常に多くの操作を処理することは非常に危険です。これは、割り込みのタイムリーな応答に大きな影響を与えます。Linuxでは、多くの場合、INIT_DELAYED_WORKを使用して、割り込みが応答する必要のある操作を処理します。
  • 関数関数
    ワークキュー(ワークキュー)は、Linuxカーネルでの操作の実行を延期するためのメカニズムです。INIT_DELAYED_WORK()はマクロです
  • 関数の場所
    \カーネル\インクルード\ 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
    • 機能分析
  • デモ

#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
オリジナルの記事を162件公開 賞賛された183件 表示回数12万回

おすすめ

転載: blog.csdn.net/qq_31339221/article/details/105057978