当前位置: 首页 > news >正文

做ui的网站有哪些江阴营销网站建设

做ui的网站有哪些,江阴营销网站建设,襄阳网站建设楚翼网络,重庆制作网站培训了解中断-共享队列 文章目录概念工作项 - work_struct一、参考资料二、共享工作队列的 API 方法三、共享队列使用方法-核心api方法说明初始化工作项-INIT_WORK调度/取消调度工作队列函数-schedule_work- cancel_work_sync小结四、共享队列驱动程序调试思考共享工作队列的适用场…

了解中断-共享队列

文章目录

  • 概念
    • 工作项 - work_struct
  • 一、参考资料
  • 二、共享工作队列的 API 方法
  • 三、共享队列使用方法-核心api方法说明
    • 初始化工作项-INIT_WORK
    • 调度/取消调度工作队列函数-schedule_work- cancel_work_sync
    • 小结
  • 四、共享队列驱动程序调试
    • 思考
    • 共享工作队列的适用场景
    • 共享工作队列的限制
  • 五 、共享工作队列 vs. Tasklet
  • 总结


概念

工作队列是实现中断下半部分的机制之一, 是一种用于管理任务的数据结构或机制。 它通常用于多线程, 多进程或分布式系统中, 用于协调和分配待处理的任务给可用的工作线程或工作进程。

个人理解:队列队列就是queue,和我们其它语言中的概念并无太大区别,放置元素地方嘛。这里我们了解的共享工作队列里面放置的是工作项: work_struct

工作项 - work_struct

工作队列里面放的是工作项,我们看看这个结构体定义:

struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func; /* 工作队列处理函数 */
};
typedef void (*work_func_t)(struct work_struct *work); //工作函数

暂时可以理解为 一个元素对象吧,在C语言中就是结构体表示而已。


一、参考资料

RK3568中断-tasklet
Linux驱动实践:中断处理中的【工作队列】 workqueue 是什么鬼?
RK3568驱动指南|第五期-中断-第44章 共享工作队列实验
linux中断下文工作队列之共享工作队列(中断四)

二、共享工作队列的 API 方法

函数/宏说明
DECLARE_WORK(name, func)静态定义工作,并绑定处理函数
INIT_WORK(work, func)动态初始化工作
schedule_work(work)调度工作(加入 system_wq 队列)
schedule_delayed_work(dwork, delay)延迟调度(delay 单位:jiffies)
cancel_work_sync(work)取消工作,并等待其完成
flush_scheduled_work()刷新全局共享队列(等待所有工作完成)

其中核心方法 动态初始化 INIT_WORK ->调度共享队列-> schedule_work

三、共享队列使用方法-核心api方法说明

初始化工作项-INIT_WORK

在实际的驱动开发中, 我们只需要定义工作项(work_struct)即可, 关于工作队列和工作者线程我们基本不用去管。 简单创建工作很简单, 直接定义一个 work_struct 结构体变量即可,然后使用 INIT_WORK 宏来初始化工作, INIT_WORK 宏定义如下:

#define INIT_WORK(_work,_func)

INIT_WORK 宏接受两个参数: _work 和 _func, 分别表示要初始化的工作项和工作项的处理函数。

调度/取消调度工作队列函数-schedule_work- cancel_work_sync

和 tasklet 一样, 工作也是需要调度才能运行的, 工作的调度函数为 schedule_work, 函数原型如下所示:

static inline bool schedule_work(struct work_struct *work)

参数是指向工作项的指针。 这个函数作用是将工作项提交到工作队列中, 并请求调度器在合适的时机执行工作项。 该函数会返回一个布尔值, 表示工作项是否成功被提交到工作队列。
如果想要取消该工作项的调度, 使用以下函数:

bool cancel_work_sync(struct work_struct *work);

参数是指向工作项的指针。 这个函数的作用是取消该工作项的调度。 如果工作项已经在工作队列中, 它将被从队列中移除。 如果工作项已经在工作队列中, 它将被从队列中移除, 并等待工作项执行完成。 函数返回一个布尔值, 表示工作项是否成功取消

小结

对比中断task RK3568中断-tasklet 会发现使用基本一致。

  • 在驱动加载的时候初始化相关内容,这里初始化的是工作项,同步绑定工作项处理函数。
  • 初始化完成后,在中断触发回调的中断上文函数中,执行中断下文机制。这里机制是 让共享工作队列调度工作项 schedule_work 方法。
  • 我们一直说共享工作队列,有共享队列的方法? 没有,它是系统内部机制,驱动程序上面看不到的,负责调度工作项即可。

四、共享队列驱动程序调试

#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/workqueue.h>int irq;struct work_struct test_workqueue;
// 工作项处理函数
void test_work(struct work_struct *work)
{msleep(1000);printk("This is test_work\n");
}
// 中断处理函数
irqreturn_t test_interrupt(int irq, void *args)
{printk("This is test_interrupt\n");// 提交工作项到工作队列schedule_work(&test_workqueue);return IRQ_RETVAL(IRQ_HANDLED);
}static int interrupt_irq_init(void)
{int ret;irq = gpio_to_irq(101); // 将GPIO映射为中断号printk("irq is %d\n", irq);// 请求中断ret = request_irq(irq, test_interrupt, IRQF_TRIGGER_RISING, "test", NULL);if (ret < 0){printk("request_irq is error\n");return -1;}// 初始化工作项INIT_WORK(&test_workqueue, test_work);return 0;
}static void interrupt_irq_exit(void)
{free_irq(irq, NULL); // 释放中断printk("bye bye\n");
}module_init(interrupt_irq_init);
module_exit(interrupt_irq_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("fangchen");

加载驱动后,点击屏幕,看一下内核日志:
在这里插入图片描述

思考

  • 如同上面所说,我们一直说共享工作队列,有共享队列的方法? 没有,它是系统内部机制,驱动程序上面看不到的,负责调度工作项即可。 schedule_work 方法实际上就是把工作项提交到共享工作队列中。
  • 你看日志打印,为什么 This is test_interrupt 一直打印,This is test_work 只是打印了两次。 这里要搞清楚 msleep(1000); 用法。 如:msleep 阻塞导致调度延迟如果频繁调用 schedule_work(),而工作项中的 msleep(1000) 尚未完成,后续调度可能被合并或丢弃。

共享工作队列的适用场景

  • 需要睡眠的任务(如内存分配、I/O 操作)。
  • 非紧急的中断下半部(如数据处理、日志记录)。
  • 替代 Tasklet:如果 Tasklet 不能睡眠,但任务需要调用可能阻塞的函数。

共享工作队列的限制

  • 调度延迟不可控:由于共享队列,可能被其他任务影响。
  • 不适合高实时性任务:如果要求低延迟,应使用自定义工作队列或 SoftIRQ。

五 、共享工作队列 vs. Tasklet

特性共享工作队列Tasklet
执行上下文进程上下文(可睡眠)软中断上下文(不可睡眠)
并发性可能并行(多 CPU)同一 Tasklet 串行执行
适用场景耗时、可能阻塞的任务轻量级、原子性任务
调度方式schedule_work()tasklet_schedule()

总结

  • 定义工作 → DECLARE_WORK 或 INIT_WORK
  • 编写处理函数 → 可以调用可能睡眠的函数
  • 调度工作 → schedule_work()(共享队列)
  • 清理工作 → cancel_work_sync()
  • 队列相关知识先了解到这里,在这里对比 tasklet 使用方式上 基本一致的。
http://www.dtcms.com/a/401216.html

相关文章:

  • 免费推广自己的网站在线网页代理网址
  • wordpress导出图片不显示不出来网络营销优化推广
  • django做的网站如何运行seo工具包
  • MAC怎么做网站腾讯人脸认证网站建设
  • 和一起做网店差不多的网站百度在线问答
  • 长沙网站建站模板成都app定制公司
  • 江苏建设部官方网站网站一级目录
  • 宁夏建设厅官方网站wordpress 首页调用栏目文章
  • 珠海建站软件我想做代理商
  • 沈阳网站建设技术公司免费的网络推广有哪些
  • 海珠区 网站设计阿里巴巴网页
  • 网站建设ktvlinux怎么下载wordpress
  • 企业网站seo维护弥勒市建设局网站
  • 初中学生做那个的网站关于中秋节网页设计实训报告
  • 哈尔滨网站建设网站开发国内大型的网站建设
  • 简约型网站开发郑州市东区建设环保局官方网站
  • 什么软件可以建设网站网站特效代码上那找好
  • 企业网站建设要注意哪方面产品网络营销推广方案
  • 福州企业网站摄影网站建设策划书
  • godaddy网站建设新闻类网站怎么建设
  • 图片分享网站建设成都设计公司哪家比较好
  • 做网站在哪个地方买空间广州系统软件app开发公司
  • 购物网站建设的意义与目的郑州做网站的外包公司有哪些
  • 自己服务器建网站 备案户外俱乐部网站模板
  • 网站 定制免费外贸接单网站
  • 邢台做网站优化哪儿好怎么自己做优惠券网站
  • 青岛网站设计案例论坛网站建设开源工具
  • 网站备案 代理hyperapp wordpress
  • 遥阳科技网站建设门户网站平台建设情况
  • 网站可以做多少优化关键词软件工程四大方向