zoukankan      html  css  js  c++  java
  • 11. linux 驱动工作队列相关API

    不是所有的驱动程序都必须有自己的工作队列。驱动程序可以使用内核提供的缺省工作队列。由于这个工作队列由很多驱动程序共享,任务可能会需要比较长一段时间才能开始执行。为了解决这一问题,工作函数中的延迟应该保持最小或者不要延时。

    需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列。

    • 创建工作队列

    每个工作队列有一个专门的线程,所有来自运行队列的任务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。

    //创建工作队列
    struct workqueue_struct *create_workqueue(const char *name);
    • 创建工作队列的任务

    工作队列任务可以在编译时或者运行时创建

    //编译是创建
    DECLARE_WORK(name, void (*function)(void *), void *data);
    //运行时创建
    INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
    • 将任务添加到工作队列中
    //添加到指定工作队列
    int queue_work(struct workqueue_struct *queue, struct work_struct *work);
            <br>
    int queue_delayed_work(struct workqueue_struct *queue, struct work_struct
            <br>
    *work, unsigned long delay);
    
    
    //添加到内核默认工作队列
    int schedule_work(struct work_struct *work);
    int schedule_delayed_work(struct work_struct *work, unsigned long delay);

    说明

    delay: 保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。

    • 队列和任务的清除操作
    //取消任务
    int cancel_delayed_work(struct work_struct *work);
    
    
    //清空队列中的所有任务
    void flush_workqueue(struct workqueue_struct *queue);
    
    
    //销毁工作队列
    void destroy_workqueue(struct workqueue_struct *queue);
    
    
  • 相关阅读:
    初试Shell脚本
    iOS分类Category探索
    cocoaPods安装爬坑总结
    关于FFmpeg工具的使用总结
    关于Boost在工程下的配置
    关于Phabricator Arcanist以及提交项目代码
    关于visual studio的一些日常总结
    关于Python在Linux、Mac和Windows上的安装方法总结
    TextSwitcher 文本切换器的功能与用法
    Android必知必会-App 常用图标尺寸规范汇总
  • 原文地址:https://www.cnblogs.com/standardzero/p/12551116.html
Copyright © 2011-2022 走看看