USB的内核线程 与 完成量之间的关系 赏析

wait_for_completion_timeout 简介 参数说明第一个参数:指向 struct completion 结构体的指针,包含等待队列信息及状态第二个参数:unsigned long 类型变量,表示等待的超时时间(以时钟节拍为单位)[1][2]返回值返回剩余的系统时钟节拍数(传入的超时时间减去等待消耗的时间)如果等待正常结束,返回值范围在 0 到传入的超时时间之间如果返回 0,表示等待超时[1][2] 阅读详情
先看完成量
usb重要的内核线程
睡眠与唤醒
 /**
    看,完成量是由 等待队列 + 原子变量 来实现的。 
    那么,问题是  : 
                他们是怎么样来实现完成量的呢?

    他的初始化函数会将done 设置为0
    再complete()加1,wait_for_completion(以及他衍生出来的函数)减 1 

    再初始化函数中会初始化等待队列,
    这里简单的说一下,具体的请往下看。有实验验证。
 */
struct completion {
    unsigned int done;
    wait_queue_head_t wait;
};

/**
    这个函数 不会 timeout,哈哈。不像wait_for_completion_timeout()函数。
    他们两个再内核中都会调用 schedule_timeout(timeout);只是传入的参数不同罢了。

    那么wait_for_completion()传入的就是这个第二个参数 MAX_SCHEDULE_TIMEOUT。
    而wait_for_completion_timeout()需要你传入一个时间,具体的欣赏再下面。

    看他第三个参数,TASK_UNINTERRUPTIBLE,
    这两个函数底层都会调用__set_current_state(state)函数,
    都会将进程状态设置为 TASK_UNINTERRUPTIBLE。
*/
void __sched wait_for_completion(struct completion *x)
{
    wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE);
}

static long __sched wait_for_common(struct completion *x, long timeout, int state)
{
    might_sleep();
    /**
        这里有一个疑问。
        再自旋锁保护的临界区 不能 调用有可能会睡眠的函数的。
        但是 do_wait_for_common() 这个函数 最终可能会调用到 schedule();
        这个又怎么解释?
    */
    spin_lock_irq(&x->wait.lock);
    /**
        真正干活的是这个函数
    */
    timeout = do_wait_for_common(x, timeout, state);
    spin_unlock_irq(&x->wait.lock);
    return timeout;
}

这里写图片描述
下面这幅图是我改动了内核源码打印出来的log

看内核线程

这里写图片描述
这里写图片描述

【USB】macOS内核态USB驱动实战:从零构建与调试 本文详细介绍了在macOS系统上从零构建与调试内核态USB驱动的完整流程,涵盖环境配置、驱动开发、编译签名、调试技巧及Apple Silicon适配等关键环节。特别针对macOS特有的系统完整性保护(SIP)机制和内核扩展开发提供了实用解决方案,帮助开发者高效完成USB驱动开发。 阅读详情

相关推荐

17、内核驱动同步、线程与USB技术解析

本文深入解析了内核驱动开发中的同步机制与线程管理技术,同时全面介绍了USB技术的架构、关键特性以及驱动开发的相关内容。涵盖了IOCommandGate、定时器、内核线程创建、USB设备类、数据传输方式等核心主题,并提供了详细的代码示例和开发注意事项。适用于希望深入了解内核编程和USB设备驱动开发的技术人员。

hh234的博客 57

Linux内核API wait_for_completion_timeout

概述 wait_for_completion_timeout函数功能描述:此函数用于阻塞当前进程,等待其他进程的执行结束,被等待进程保存在输入参数的wait字段所代表的等待队列中。有两种情况可以结束此种等待:第一,当等待队列中的进程被函数complete( )或函数complete_all( )唤醒,等待结束,阻塞进程将继续执行;第二,当等待的时钟节拍超时时,被阻塞的进程会继续执行。 此函数将当前进程设置为不可中断的等待状态,所以即使通过Ctrl+C组合键也不能强制结束等待;此函数设置的等待时间是函数

咸鱼弟的博客 7632

RK3568平台(USB篇)USB框架与USB识别流程

我们暂且把这样的叫做标准的USB接头吧。后来出现了,又增加了miniUSB接头。而miniUSB接头则有5条线,多了一条ID线,用来标识身份用的。即带电插拔,热插拔功能就是允许用户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,从而提高了系统对灾难的及时恢复能力、扩展性和灵活性等。

weixin_49303682的博客 2380

Linux内核函数--wait_for_completion_timeout

是一个在Linux内核编程中非常有用的函数,它允许开发者在等待某个事件或操作完成时设置一个明确的超时时间,从而增强了程序的健壮性和可控性。是一个在Linux内核中常用的函数,其主要功能是阻塞当前进程,等待某个特定的事件或操作完成,或者在指定的超时时间后继续执行。

MHD0815的博客 2383

42、用户空间USB驱动与内核调试技术详解

本文详细介绍了用户空间USB驱动的实现及其优势,并深入探讨了内核调试技术。内容涵盖用户空间库IOUSBLib的使用、同步传输的低延迟处理方法,以及内核调试中常见的问题类型和调试机制,帮助开发者更好地开发和维护内核模块及驱动程序。

hh234的博客 84

16、驱动开发中的同步、线程与USB技术解析

本文深入解析了驱动开发中的关键技术和概念,涵盖同步机制(如IOCommandGate和IOTimerEventSource)、内核线程的创建与管理,以及USB系统的架构与设备驱动开发要点。重点介绍了定时器的使用、工作循环的释放、USB主从通信模型、数据传输类型及热插拔处理流程,并结合代码示例和图表帮助理解。文章旨在为驱动开发者提供关于系统稳定性与性能优化的实用指导,展望未来USB技术发展对驱动开发的影响。

yy01234的博客 47

linux内核 timeout,Linux内核的wait_for_completion_timeout未完全唤醒

我正在处理i2c-omap驱动程序的一个奇怪问题。我不确定问题是否在其他时间发生,但是当我尝试关闭系统时发生了大约5%的问题。 在系统关机期间,我通过I2C写入PMIC中的某些寄存器。在i2c-omap.c中,我可以看到调用线程正在等待wait_for_completion_timeout,超时值设置为1秒。我可以看到称为“完整”的IRQ(我在完成后添加了printk)。但是,在“完成”被调用之后...

weixin_31978735的博客 1981

单片机课程设计——交通灯

单片机课程设计——交通灯一、课程设计主要内容1.1 题目1.2摘要1.3关键词二、设计要求三、设计方案四、参考电路设计4.1.1数码管的设计4.1.2对应程序4.2.1独立按键的设计4.2.2对应程序4.2.3 使用逻辑4.3.1LED模块的设置4.3.2 LED实物图4.3.3 LED显示程序五、调试要点5.1 单片机最小系统5.2 数码管模块5.3 LED模块5.4 独立按键六、总结七、成品图完整程序 一、课程设计主要内容 1.1 题目 交通灯设计 1.2摘要 近年来,随着我国国民经济的快速发展,我国机

PKPROTEUS的博客 3万+

wait_for_completion_timeout 超时返回0 的问题

"kernel/sched/core.c" 3419 /** 3420  * wait_for_completion_timeout: - waits for completion of a task (w/timeout) 3421  * @x:  holds the state of this particular completion 3422  * @timeout:  t

lqxandroid2012的专栏 9442

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线

本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。

weixin_30680385的博客 339

PCIe 6.0实战指南:从链路训练到信号完整性的避坑手册

本文是一份针对PCIe 6.0硬件工程师的实战避坑指南。文章深入解析了从NRZ到PAM4调制带来的信号完整性挑战,详细拆解了链路训练(LTSSM)的复杂过程与调试方法,并提供了从信道仿真到实验室实测(如使用Keysight示波器进行眼图与误码率分析)的完整信号完整性闭环验证策略,帮助工程师解决高速率下的链路不稳定与降速问题。

weixin_29306875的博客 342

赏析linux kernel 中的内核线程

内核线程是怎么被创建出来的,他是由”二号进程”kthreadd生产出来的,浅析请见我以前的博文: http://blog.youkuaiyun.com/leesagacious/article/details/50191407USB khubd 这个内核线程以前欣赏过 http://blog.youkuaiyun.com/leesagacious/article/details/50506854 现在详细说一次,先

500 1125

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

jks212454的博客 2386

Llinux内核移植 part4:USB hub线程

USB系统: hub线程1. hub表征usb子系统中所有和hub相关的都交由一个内核线程表征, 通过 static struct workqueue_struct *hub_wq 来管理。 创建/删除 hub_wq = alloc_workqueue("usb_hub_wq", WQ_FREEZABLE, 0); destroy_workqueue(hub_wq); queue_work(hu

叶玄青的博客 2580

手机端实时检测:YOLOv8n轻量化改进,骁龙865上35FPS,mAP+3.2%

YOLOv8n-Lite的改进不是简单的“砍通道、降分辨率”,而是结合手机端硬件特性(NPU加速、内存限制)和场景需求(小目标检测),通过“卷积拆分减少计算、通道瘦身适配内存、特征强化保留精度”的协同策略,在骁龙865上实现35FPS实时性与mAP+3.2%的双赢。该方案已在手机端AR应用中落地,支持实时手势识别、物体测量等功能,功耗比原始模型降低40%(连续检测1小时仅耗电12%)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 724

编写python脚本调用ordinals以及BRC20的接口

1、钱包地址生成walletreceive,对应ord命令:ord wallet receive。6、测试手动出块generate,这个只在regtest链节点用得上。所有接口都是post请求,采用postman进行测试。4、测试bitcoin转币sendtoaddress。7、测试其他的wallet方法wallet。2、钱包币种铭刻inscription,对应bitcoin-cli命令。对应bitcoin-cli命令。对应bitcoin-cli命令。fee.json文本模板。还可以加很多根据需要加减。

云深海阔专栏 1048

linux内核进程线程,linux内核线程问题

我是linux内核初学者,请教大虾内核线程和用户进程有什么区别具体实现的流程和代码是什么啊|尽管linux是一个宏内核系统,但是kernelthreads(内核线程)依然存在,以便并行地处理一些内核的“家务”这些任务不占用USERmemory(用户空间),而仅仅使用KERNELmemory。和其他内核模块一样,它们也在高级权限(i386系统中的RING0)下工作作。内核线程是被kernel...

weixin_28921621的博客 187

芒果YOLO11改进17:即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

包括YOLOv5、YOLOv7、YOLOv8等模型改进 483

编译自定义Linux内核,使WSL支持访问Windows下USB设备

在附加 USB 设备之前,必须使用命令 usbipd bind 来共享设备,从而允许它附加到 WSL( 需要管理员权限)。在 WSL 环境下,usbip 允许你在 Linux 子系统中访问连接到 Windows 主机的 USB 设备。下载内核源代码,通过 uname -r 命令查看 Linux 内核版本,checkout 对应的版本。通过以上步骤,WSL 2 将使用你自定义编译的内核来支持额外的驱动程序,特别是 USB 相关的功能。这里的 2-6 是 USB 设备对应的 BUSID。

1571

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3931

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux内核线程创建

本文旨在简单介绍一下Linux内核线程: 先举个例子: 不插U盘,在Linux命令行中输入:ps -el;然后插上U盘,再次输入:ps -el 会发现多出了下面一行(当然还会有其他的,比如scsi相关的): 1 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 2 1 S 0 ...

anqian8401的博客 226

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux内核 usb转串口,Linux 使用usb转串口作为调试串口

芯片串口用来做数据通信使用,需要调试串口时则使用usb转串口debug用。内核需要几个配置的地方:1)-> Device Drivers| -> USB support (USB_SUPPORT [=y])| -> USB Serial Converter support (USB_SERIAL [=y])2)usb转串口的driver,选择相应厂商3...

weixin_35916239的博客 1412

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

USB驱动开发——认识USB驱动

USB协议本身不是我本篇博客的介绍,网上有前辈们已经写了很好的总结。本篇博客将聚焦于USB驱动框架上,下一篇博客将介绍USB驱动开发 在网上找到了一个图 开发的重点是USB设备驱动程序,不过我们可以从USB总线驱动(也就是图中的USB核心)开始分析 当把USB设备插入到开发板,串口打印如下信息 ...

weixin_39234635的博客 1279

WSL2内核编译实战:解锁USB摄像头与OpenCV开发环境

本文详细介绍了在WSL2中解决USB摄像头无法访问问题的完整方案。通过分析WSL2内核默认不包含USB摄像头驱动的根本原因,提供了从使用usbipd工具共享Windows摄像头设备,到手动编译集成UVC驱动的WSL2自定义内核,再到配置OpenCV开发环境的全流程实战指南,最终成功解锁了在WSL2中进行计算机视觉开发的能力。

weixin_29279153的博客 616

【操作系统-Day 16】揭秘线程的幕后英雄:用户级线程 vs. 内核级线程

在上一篇文章中,我们揭开了线程的神秘面纱,理解了它作为“比进程更轻盈的执行单元”的核心概念。然而,一个关键问题随之而来:这些线程究竟是由谁来创建、调度和管理的?这个问题的答案,将我们引向操作系统中一个至关重要的设计决策——线程的实现方式。本文将深入探讨两种主流的线程实现机制:**用户级线程 (User-Level Threads, ULT)** 和 **内核级线程 (Kernel-Level Threads, KLT)**。我们将详细剖析它们的工作原理、优缺点,并通过 **多对一、一对一、多对多** 这三种

吴师兄大模型的博客 1198

Linux内核线程的建立

创建内核线程的函数: thread = kthread_create(taskq_thread, tqt, "%s/%d", name, i); wake_up_process(thread); 其中taskq_thread为该内核函数需要做的事情。 For Example:   resume complete时usb driver会调用do_rebind_interface(

chrovery的专栏 413
上一篇: linux-kernel-4.1 USB-批量传输 赏析
下一篇: linux kernel BT 实现 -- 赏析
leesagacious
博客等级 码龄12年 146粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值