libusb注意事项笔记

1、线程安全

libusb 被设计为完全线程安全的,但与任何 API 一样,它无法阻止用户故意或无意地破坏自己。

请遵循以下一般准则:

  • 释放资源的函数(例如libusb_close()、libusb_free_config_descriptor())不应在同一资源上同时调用。这与在同一分配的指针上同时调用 free() 没什么不同。

  • 每个单独的libusb_transfer都应由单个线程准备。换句话说,任何两个线程都不应同时填写libusb_transfer的字段。您可以将其比作从多个线程使用同一目标缓冲区调用 sprintf()。除非输入参数全部相同,否则结果可能不是您想要的,但最好完全避免这种情况。

  • 在传输提交和调用完成回调之间,不应访问libusb_transfer结构及其相关数据缓冲区。你可以认为在传输处于活动状态时,这些东西的“所有权”被转移给了 libusb。

  • 不应同时在资源上调用各种“setter”函数(例如libusb_set_log_cb()、libusb_set_pollfd_notifiers())。虽然这样做不会导致任何未定义的行为,但可能会产生应用程序不期望的结果。

2、fork注意事项

ibusb并非设计用于跨 fork() 调用工作。根据平台的不同,父进程中可能存在子进程无法使用的资源(例如 Linux 上的热插拔监视器线程)。

3、设备重置

libusb_reset_device()函数允许你重置设备。如果你的程序必须调用这样的函数,显然应该意识到重置将导致设备状态改变(例如寄存器值可能会被重置)。libusb 不提供一种机制来通知您,如果其他人重置了您的设备,您自己的程序将不清楚设备状态发生变化的原因。

4、只有阻塞实现的函数

下面列出的功能只能通过同步、阻塞函数实现。没有异步/非阻塞替代方案,也没有明确的实现方法。

  • 配置激活(libusb_set_configuration())

  • 接口设置激活(libusb_set_interface_alt_setting())

  • 释放接口(libusb_release_interface())

  • 清除停止/停转条件(libusb_clear_halt())

  • 设备重置(libusb_reset_device())

5、配置选择和处理

对于具有多个配置的设备,当前选择的配置也可能不是应用程序想要使用的配置。

显而易见的解决方案是在设备初始化例程的早期添加对libusb_set_configuration()的调用,但需要注意一些事项:

  • 如果设备已经处于所需配置,则使用相同配置值调用libusb_set_configuration()将导致轻量级设备重置。这可能不是理想的行为。

  • 如果所需配置已处于活动状态,libusb 甚至可能无法执行轻量级设备重置。例如,以我的带指纹读取器的 USB 键盘为例:我有兴趣通过 libusb 驱动指纹读取器接口,但内核的 USB-HID 驱动程序几乎总是会声明键盘接口。由于内核已声明接口,因此甚至无法执行轻量级设备重置,因此libusb_set_configuration()将失败。(幸运的是,相关设备只有一个配置。)

  •  如果其他程序或驱动程序已声明接口,libusb 将无法设置配置。具体而言,这意味着在libusb_set_configuration()成功之前,内核驱动程序必须与所有接口分离。

解决上述问题的一个方法是考虑当前活动的配置。如果我们想要的配置已经处于活动状态,那么我们不必选择任何配置:

cfg = -1;
libusb_get_configuration(dev, &cfg);
if (cfg != desired)libusb_set_configuration(dev, desired);

这可能适用于大多数场景,但本质上是危险的:另一个应用程序或驱动程序可能会在libusb_get_configuration()调用之后更改所选的配置。

即使在libusb_set_configuration()成功的情况下,也请考虑在您的应用程序调用libusb_set_configuration()后其他应用程序或驱动程序可能会更改配置。

将设备锁定为特定配置的一种可能方法如下:

  • 设置所需的配置(或使用上面的逻辑来实现它已经处于所需的配置)
  • 声明您希望使用的接口
  • 检查当前活动配置是否是您想要使用的配置。

上述方法之所以有效,是因为一旦声明了接口,任何应用程序或驱动程序都无法选择其他配置。

6、零长度数据包

  • libusb 能够通过提交零长度的传输来向端点发送零长度的数据包。

  • LIBUSB_TRANSFER_ADD_ZERO_PACKET标志目前在 Linux、Darwin 和 Windows(WinUSB)上受支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇聚荣拼多多电商哪些热词比较受关注?

汇聚荣拼多多电商哪些热词比较受关注?在探讨拼多多电商平台的热点关键词时,我们首先得明确,这个平台因其独特的商业模式和市场定位,吸引了大量消费者的目光。拼多多通过“拼团”购物的方式迅速崛起,成为电商行业的一个重要力量。…

2024年用scrapy爬取BOSS直聘的操作

SCrapy框架实现对BOSS直聘的爬取 文章目录 SCrapy框架实现对BOSS直聘的爬取对SCrapy框架的一个简单认识Scrapy 组件的作用Scrapy 数据流 1. 测试反爬2. 定义一个下载中间件类,截取spiders的请求(中间件直接截取请求,并且返回给Spider进行数据解析&#x…

【最新鸿蒙应用开发】——用户信息封装

用户管理工具封装 1. 为什么要封装 在进行如下登录功能时, 通常需要将一些用户信息以及token进行持久化保存,以方便下次进行数据请求时携带这些用户信息来进行访问后端数据。下面分享一下鸿蒙当中实用的持久化封装操作。 2. 步骤 封装用户信息管理工具…

Mybatis Plus 自动填充注解 @TableField(fill = FieldFill.INSERT_UPDATE)

第一步:在需要自动填充的位置加上注解 通过在创建时间和修改时间上添加 fill 填充字段 进行自动填充 第二步:要想实现自动填充还需要实现MetaObjectHandler接口,在这里实现自动填充的逻辑 Component public class MyMetaObjectHandler …

tinyshop项目部署

参考软件测试之测试用例设计(四)_管理后台 测试用例-CSDN博客 1、下载xampp 2、修改apache和mysql的端口分别为4431 ,8013和3306 3、访问页面:输入ip:端口号,出现以下页面即成功 4、安装tinyshop商城 将解压的tinys…

动态住宅代理IP详细解析

在大数据时代的背景下,代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性,而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

Transformation(转换)开发-switch/case组件

一、switch/case组件-条件判断 体育老师要做一件非常重要的事情:判断学生是男孩还是女孩、或者是蜘蛛,然后让他们各自到指定的队伍中 体育老师做的事情,我们同样也会在Kettle中会经常用来。在Kettle中,switch/case组件可以来做类似…

【等保2.0的内容有哪些?】

“在“等保2.0”的基础上,分别增加了云计算安全、移动互联安全、物联网安全、工控系统安全、大数据安全5个拓展需求。 《中华人民共和国刑法》第253条,非法将公民个人资料卖给他人,并处罚金。 违反国家相关法律法规,将其在执行公…

vue2使用use注册自定义指令实现输入控制与快捷复制

使用场景 在一些form表单填写内容的时候,要限制输入的内容必须是数值、浮点型,本来el-input-number就可以实现,但是它本身带那个数值控制操作,等一系列感觉不舒服的地方。如果只是使用el-input该多好,只要监听一下输入…

pycharm无法添加python解释器的解决方法

出现该错误的原因是先前创建过重名的解释器(虚拟环境),在pycharm配置中没有完全删除干净。解决方法如下: 首先在文件->设置界面,找到解释器设置。 然后先按图所示点击全部显示虚拟环境: 接着将无法添…

如何快速掌握一门编程语言

学习一门新的编程语言可能是一个具有挑战性的过程,但通过一些系统的方法,可以大大加快这个过程。 目录 第一步:通过书籍和视频课程掌握基本语法1. **学习编程语言的基础知识**2. **掌握字符串处理**3. **掌握正则表达式和解析器**4. **掌握面…

大数据开发如何快速进阶

目录 1. 个人经验与心得分享1.1 试错的价值与机会把握1.2 投入产出比的考量1.3 刻意练习与技能提升1.4 目标设定与职业规划1.5 自我驱动与成长1.6 第一性原理的应用 2. 大数据开发领域的挑战与机遇2.1 技术革新的挑战2.2 数据治理的难题2.3 人才短缺的问题2.4 投入产出比的考量…

权限类漏洞解析——功能权限篇

上一篇【一文理解权限类漏洞产生的原因之未授权篇】有讲过未授权漏洞产生的原因,但是在我实际的挖洞过程中,其实遇见很少,我有印象的好像只有几个非核心站点的中危。 但是对于另一类权限漏洞,功能及数据权限相关的漏洞就不一样了…

计算机图形学入门23:蒙特卡洛路径追踪

1.前言 前面几篇文章介绍了Whitted-style光线追踪,还介绍了基于物理渲染的基础知识,包括辐射度量学、BRDF以及渲染方程,但并没有给出解渲染方程的方法,或者说如何通过该渲染方程计算出屏幕上每一个坐标的像素值。 Whitted-style光…

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老,使用SQLServer 2012 计算距离需执行视图,如下: SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…

【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法

一、介绍 坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实(‘杏仁’, ‘巴西坚果’, ‘腰果’, ‘椰子’, ‘榛子’, ‘夏威夷果’, ‘山核桃’, ‘松子’, ‘开心果’, ‘核桃’&a…

CTO透露GPT-5内幕,OpenAI 以36亿美元收购数据库初创公司

目录 01 GPT-5 02 OpenAI收购Rockset 2.1 谁是Rockset? 2.2 OpenAI的目的是什么? 01 GPT-5 虽然GPT-4的视频通话功能尚未全面推广,但OpenAI的CTO已经对即将到来的GPT-5给出了新的暗示。 不久前,Mira回到母校达特茅斯工程学…

springboot 自定义的全局捕获异常失效

背景:springbootspringcloud 分布式微服务。 问题:公共模块在使用RestControllerAdvice全局捕获异常时,捕获不到子服务抛出的相应异常 首先看一下全局异常组件有么有被扫描到 如何查看,很简单只需要写一段类加载打印代码&#x…

剪映数字人口播原理终于搞清楚了

剪映版本升级了,新版本支持数字人定制,于是我赶紧申请了使用资格 目前的价格是49元单个价格/30天 支付49元之后剪映要求上传2.5至10分钟的视频 接着要阅读一段话并录制视频上传 第三步提交,提交完成之后大概两三个小时就会有一个特定数字人形象出现:

嵌入式c语言3——自定义数据类型

结构体struct,共用体union 结构体中定义变量,首尾地址相连 对于union,其包含变量对起始地址相同 由于其起始地址相同,则改变其中某一变量值时有可能使得另一个变量值发生改变 enum 枚举,可以用来定义一堆整形常量构成…