USB 驱动开发 --- Gadget 驱动框架梳理(一)
本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。
Gadget 框架
在 USB 协议交互过程中,角色定义:
-
the device driver is the master (or “client driver”)
Linux 内核中称为 HCD(Host Controller Driver),负责与 USB 主机控制器硬件(通常是计算机的 USB 控制器)进行交互,管理 USB 数据传输。
-
the gadget driver is the slave (or “function driver”)
Linux 内核中称为 UDC(USB Device Controller),管理连接到 USB 设备端的硬件,处理设备端的数据传输、设备枚举和其他 USB 设备相关的操作。
USB Controller Driver(UDC 驱动)
<linux/usb/gadget.h>
定义的API中,对底层 USB 控制器端点硬件抽象成 endpoint (能够接收 IN/OUT 数据流),通过回调与 Gadget Driver 交互。- Controller Driver 采用分时复用的方式进而可以对接任意数量的 Gadget Driver 交互;
Gadget Driver
对 USB Controller 的硬件抽象以支持 USB Function 开发,形式为各种调用接口。Gadget Driver 工作职责如下:
- 响应 setup 请求, 由 ep0 负责的相关协议的应答也包含 calss 类别相关功能实现;
- 响应 configuration、String 描述符;
- (重新)设定 Configuration 和 Interface, 包含对端点的 使能与配置;
- 报告 活动事件,例如:绑定到硬件、挂起/恢复、远程唤醒、断连等;
- 管理 所有端点的 IN/OUT 收发;
Linux 社区并不鼓励通过这个方式添加如此多的专有驱动。
Upper Level
在 Gadget driver 之上可以连接到 Linux 内核的其他驱动或框架,通过绑定的形式与 Dadget 驱动完成数据的收发。可参考:
- 用户空间,使用 gadgetfs 或
/dev
下相应节点操作; - 网络子系统,如:CDC Ethernet Model gadget 驱动;
- 其他:Input 子系统(HID gadgets)、Sound 子系统(Aduio gadget)、文件系统(PTP gadget)等;
Additional Layers
可选的层,如:内核网络模块栈、用户应用、标准 POSIX 系统调用等。
Gadget API
数据结构
gadget driver 使用struct usb_gadget_driver
包含自身信息之外还包含另外三种数据类型。理解这些数据类型和使用方法就算是掌握了API。
-
usb_gadget_driver
dadget信息;//----> linux_5.10/include/linux/usb/gadget.hstruct usb_gadget_driver {...int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *);
-
usb_gadget
,枚举信息;struct usb_gadget {...struct usb_udc *udc;
-
usb_ep
,端点配置;struct usb_ep {...const struct usb_ep_ops *ops; ...struct usb_ep_caps caps; ...u8 address;const struct usb_endpoint_descriptor *desc;
-
usb_request
,数据收发;struct usb_request {void *buf;unsigned length;
-
linux/usb/ch9.h
,Gadget 驱动使用的在USB ch9 中定义的公共的 USB 数据结构,不分 Host 与 Device。
使用中关注:
- 规定使用端点0作为作为各种硬件限定信息的配置与管理,如:发送类型、地址、包大小、缓存和其他能力集;
- USB message 臃肿(chunky),一个IO请求需要由一个或多个”数据包“组成且边界可被驱动感知;
- USB 协议更像是异步通信协议(如:HDLC,每帧有 N 个 Byte,多个地址,Host 第一站,Device 其次)超过异步通信协议(如:TTY,每帧8个 Bit,无奇偶检验位,无停止位);
- USB 数据包是有边界的,如: 一个 USB IN 包数据是 two-byte 一个单元,因此不能将两个单字节直接写入一个单元;
对象与方法
Gadget 设备
核心
<linux/usb/gadget.h>
, 定义了 Gadget 驱动核心对象与方法;
可选
核心 API 已足够支撑 Gadget 驱动开发,但还另外提供了一些可选工具用以简化常用任务。
drivers/usb/gadget/usbstring.c
;drivers/usb/gadget/config.c
;
composite 设备
核心 API 已足够开发 Composite 设备(一个 configuration 中有多个功能)和 多功能设备驱动的开发,composite 复合框架将简化这些设备驱动的开发。
框架
composite 设备框架定义了一个设备结构体 struct usb_composite_driver
,其内可关联多个struct usb_configuration
实例。每个 configuration 又包含多个 struct usb_function
定义。在 function 中定义了用户可感知的设备角色,如:Network Link、mass storage device,也可包含管理功能,如:Device Firmware Upgrade。
include/linux/usb/composite.h
,数据结构定义;drivers/usb/gadget/composite.c
,框架实现;
功能
当前只要是使用 DECLARE_USB_FUNCTION_INIT
声明的 Gadget 驱动就都是 composite设备,可对应查看源码 drivers/usb/gadget/function/f_xxx.c
。
Legacy 设备
源码目录 drivers/usb/gadget/legacy/xxx.c
。
活动事件
Gadget 驱动执行I/O请求时时不用关注硬件细节要求,而当驱动执行 setup/configuration 时就需要关注流程:
-
注册 UDC 驱动(USB Device Controller,作为**设备(Slave)**角色的 USB 控制器驱动);
当前作为设备插入 Host 后会处于
attached
初始化状态( USB ch9 中定义)。此时既无功率消耗也法被使用(还不支持枚举)。因为当前数据线上的上拉未使能,所以即使 VBus 正常供电,Host 也无法感知到当前设备的存在(Host 通过设备是否上拉数据线探测设备)。
-
注册 Gadget 驱动;
这些更高层级的 Fuction 驱动将调用
bind()
绑定到具体的 gadget 设备(struct usb_gadget
对象) 。有时这些 Function会在识别到 VBUS 后使能数据线上拉。 -
硬件驱动开始枚举;
此时设备可以接受 USB
power
和set_address
请求,余下步骤由 gadget driver 接管。如果 dadget driver 在枚举前还未加载,忽略其后步骤直接跳转至步骤 7,执行unbind()
。 -
实现 Gadget 驱动中
setup()
方法;setup()
方法将返回当前设备的:描述符、硬件接口和能力集等信息。如果硬件允许,甚至可以执行更复杂的设定和配置。 -
实现
set_configuration
请求的应答;Gadget 驱动需要在
setup()
方法中实现对主机set_configuration
请求的应答(枚举的最后一步),使用所有在 Configuration 中使用的端点 和 默认 settings 中的接口; -
实现数据收发;
-
实现 Gadget 驱动中
unbind()
方法;当 Gadget 驱动卸载时,同时卸载 UDC 驱动;
注:
-
在设备连接到Hub后会导致Hub的D+或D-电平变化,Hub根据变化的引脚分辨接进来的是全速设备还是低速设备:
-
低速设备内部的D-有1.5K的上拉电阻;
-
全速设备内部的D+有1.5K的上拉电阻;
-
高速设备一开始也是作为全速设备被识别的,高速模式时,D+的上拉电阻是断开的;
-
UDC 驱动
UDC(USB Device Controller),即USB从机(设备)控制器,内核文档也称为 Peripheral Controller Drivers。内核中第一个支持的硬件的是 NetChip 2280 控制器(基于PCI 的支持 USB 2.0 调整模式)。其他的控制器基于 gadget
框架开发,见驱动源码文件: linux_5.10/drivers/usb/gadget/udc/xxx_udc.c
。
虚拟UDC
方便硬件控制器未准备好(缺失或功能异常)时的软件调试,内核实例了一个虚拟的 UDC 驱动。它像 net2280、pxa25x 和 sa11x0 等硬件控制器一样指代多个端点和速率模式,也能够模拟 控制传输、批量传输 和 中断传输。这也就方便了开发支持在
Gadget 驱动
除 gadget_Zero
驱动(主要用于UDC功能验证)之外,内核还有示例了多个常用的 gadget 驱动。
CDC 类
CDC(Communications Device Class)是太网模型的两个强制选项之一,也是电缆调制解调器交互操作性的标准之一。在USB主机看来,使用此代码的gadget 就像是以个太网适配器。
CDC类实现源码文件位于:drivers/usb/gadget/function/f_xxx.c
,其下包含:
- USB CDC serial 类: ACM;
- USB CDC Ethernet 类:ECM、EEM、RNDIS,简单辨析如下:
注:暂且把 微软的 RNDIS 驱动也纳入CDC Ethernet 类,因为 RNDIS 更适合运行在轻量化的 USB 控制器设备中。RNDIS 为设备接入 Windows 系统使用提供了便捷。
MSC 类
MSC(Mass Storage class)指常用的存储设备,如:U盘、CD-ROM等。大容量存储类设备驱动使用一种不同于 MS-Windows 和 MacOS 的交互方式:
- USB 设备端,驱动使用一个具体的文件或块设备作为其后端存储介质;
- USB 主机端,主机遵循 BBB, CB 或 CBI 版本的 MSC 类规格要求使用 SCSI 命令访问后端不认介质;
MSC 类实现源码文件包含:
drivers/usb/gadget/function/f_mass_storage.c
,被主机视为 磁盘、CD-ROM 等存储设备访问;drivers/usb/gadget/function/f_loopback.c
,主要用于应用回环测试;
OTG 功能
USB OTG(USB On-The-GO)指代可以进制双角色切换机制的 USB 控制器:
- 作为 Host时,使用标准 Linux-USB 主机侧驱动栈;
- 作为 Device时,使用 Gadget 框架;
见下图,可以看到:Host Controllere、 Device Controller、OTG Bus Monitor 三个重要组成
在不同角色下,系统都应尽量复用顶层已申请的、硬件无关的顶层控制器驱动(Host, usb_bus
;Device, usb_gadget
)内存池;保证功能正常的最小修改;保证对非 OTG 产品的影响。可以抽象出以下几个控制特性:
is_otg
,Gadget 驱动检查这个标记以确认是否需要在其 configurations 中添加 OTG 描述符;b_hnp_enable
, Gadget 驱动如果需要支持两种新的 OTG 协议:- HNP, 通过用户接口(如:两个 LED 灯)指示当前设备被 Host 挂起;
- SRP, 可由用户发起(就像远程唤醒),如按下相关按键;
- 白名单,如同主机侧,驱动必须支持 OTG 目标外设名单,用以声明支持的 OTG 控制器,即 OTG 白名单。修改文件
otg_whitelist.h
。
需知
- 每个 USB Function 都会在 config_groups 中定义期望用户配置的内容,可配置参考对应 Function 的实现文件:
drivers/usb/gadget/f_*.c
- 主要阅读 USB 规范章节9 和 内核 gadget.rst 文档,以免忽略掉关键信息,如:端点自动配置,否则需要同时参考头文件与示例源码(如 Gadget Zere);
参考
- 内核文档 linux_5.10/Documentation/usb/gadget_configfs.rst
- 11_Gadget驱动程序框架
相关文章:
USB 驱动开发 --- Gadget 驱动框架梳理(一)
本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中,角色定义: the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver),负责与 …...
C#读写ini配置文件保存设置参数
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...
Linux---history查看命令历史记录命令
history命令是Linux系统中用于显示和管理用户之前执行过的命令列表的实用工具。以下是history命令的详细教程: 一、基本功能 history命令能够显示用户在当前shell会话或之前会话中执行过的所有命令。这对于回顾之前的操作、复制某个命令进行修改再次执行等场景非常…...
CANopen 学习笔记(2)
PDO通讯参数 异步传输 发送类型设置为0xFE或0xFF 修改映射参数后执行sendPDOevent(&CanFestival_Master_Data); /* 发送PDO事件 */则会触发PDO传输 还有一直就是定时器异步发送,配置发送类型为0xFE,定时器发送时间为0x64,则会以100ms的周期发送P…...
《鸿蒙Next旅游应用:人工智能赋能个性化与智能导览新体验》
随着鸿蒙Next的推出,旅游应用迎来了全新的发展机遇,借助人工智能技术能为用户带来更出色的个性化推荐和智能导览服务。 鸿蒙Next与人工智能融合优势 鸿蒙Next拥有强大的分布式能力和原生智能体验。其能打破设备界限,实现多设备协同…...
计算机网络 (39)TCP的运输连接管理
前言 TCP(传输控制协议)是一种面向连接的、可靠的传输协议,它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制,其过程如下&…...
Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250114
逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/18YtQiLnt06cPQP1nRXor0g?pwd4k3h 提取码: 4k3h Level2逐笔成交逐笔委托数据分享下载 基于Level2的逐笔成交和逐笔委托数据,这种毫秒级别的记录能分析出许多关键信息,如庄家意图、虚假动作&#…...
探索Java(适合小白)
探索Java:推动数字世界的语言 Java,这一编程语言在信息技术的海洋中如同明珠般闪耀,吸引着无数程序员的关注与热爱。在今天的博客中,我们将深入了解Java的定义、学习的重要性,并详细探讨Java EE的概念。无论你是编程新…...
Java Web开发高级——Spring Boot与微服务架构
微服务架构(Microservices Architecture)已经成为现代软件开发中的主流架构之一。它通过将单一的、庞大的应用程序拆分成多个小的、独立部署的服务,使得开发、维护和扩展变得更加灵活、可控。Spring Boot 提供了一种简单且高效的方式来构建微…...
IMX6U Qt 开发环境
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、交叉编译 1. 安装通用 ARM 交叉编译工具链 2. 安装 Poky 交叉编译工具链 二、编译出厂源码 1. U-boot 2. 内核和模块 3. 编译出厂 Qt GUI 综合 Demo 前言…...
【计算机网络】lab5 ARP协议
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
在使用 PySide6 进行开发时,管理应用程序的资源(如图标、图片、字体、样式表、音视频等)是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc,它能够将资源文件(.qrc)编译成 Python 模块,然后…...
【C】初阶数据结构3 -- 单链表
之前在顺序表那一篇文章中,提到顺序表具有的缺点,比如头插,头删时间复杂度为O(n),realloc增容有消耗等。而在链表中,这些问题将得到解决。所以在这一篇文章里,我们将会讲解链表的定义与性质,以及…...
STM32 FreeRTOS 基础知识
多任务处理 内核是操作系统的核心组件。诸如 Linux 这样的操作系统采用的内核, 看似允许用户同时访问计算机。很明显,多个用户可以同时执行多个程序。 每个执行程序都是受操作系统控制的任务(或线程)。如果一个操作系统能够以这…...
初学stm32 --- II2C_AT24C02,向EEPROM中读写数据
目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…...
探索图像编辑的无限可能——Adobe Photoshop全解析
文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里,视觉内容无处不在,而创建和编辑这些内容的能力已经成为许多行业的核心技能…...
当comfyui-reactor-node 安装失败urllib.error.HTTPError: HTTP Error 403: Forbidden解决方法
comfyUI 节点comfyui-reactor-node 安装 python install 时 报错 urllib.error.HTTPError: HTTP Error 403: Forbidden 如下: (xxx) xxxxxxx:~/sdb/Q/ComfyUI/custom_nodes/comfyui-reactor-node$ python install.py Traceback (most recent call last): File …...
01基本介绍篇(D2_多线程问题)
目录 一、线程的上下文切换问题 1. 基本介绍 2. 多线程一定比单线程快? 3. 如何减少上下文切换 二、线程安全问题 1. 什么是线程安全? 2. java语言中的线程安全 2.1. 不可变 2.2. 绝对线程安全 2.3. 相对线程安全 2.4. 线程兼容 2.5. 线程对立…...
如何保证光谱相机的稳定性和可靠性
光学系统设计与制造 高质量光学元件:采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差,确保光线准确聚焦;高质量的镀膜能够提高光学元件的透光率,降低反射损失,并且增强对不同波段光…...
基于springboot+vue的洪涝灾害应急信息管理系统设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
登录、注册、忘记密码、首页HTML模板
<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录</title><style>body {display: fl…...
HTML文章翻页功能
效果展示: 效果原理: 1、引入CDN 2、绘制文章翻页样式,以及自动分段 3、获取窗口宽高,计算出当前文章总分段,并实现分页 4、完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8&qu…...
JAVA安全编码规范
1. 数据校验 对外部输入进行校验入参的合法性, 防止内存越界,命令注入,SQL注入,格式化字符串漏洞 校验长度,范围,输入校验采用白名单形式 校验前做归一化处理,使用java.text.Normalizer的n…...
OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)
运行效果 工程说明 源码 vertex.glsl...
爬虫逆向学习(十五):Akamai 3.0反爬分析与sensor-data算法逆向经验
此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理 Akamai 3.0反爬分析与sensor-data算法逆向经验 Akamai开始正题前须知站点信息接口分析反爬点反爬点定位_abck定位结果 逆向前准备工作sensor_data生成位置本地替换文件 请求体sensor…...
java项目启动时,执行某方法
1. J2EE项目 在Servlet类中重写init()方法,这个方法会在Servlet实例化时调用,即项目启动时调用。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;public class MyServlet extends HttpServlet {Overridepublic void …...
学会使用开源软件jclasslib 字节码文件的组成 详解
应用场景 1 应用场景 2 学习路线 以正确的姿势打开文件 字节码文件的组成 玩转字节码常用工具 以正确的姿势打开文件 开源软件 jclasslib github 地址 https://github.com/ingokegel/jclasslib 工具使用 字节码文件的组成 基本信息 常量池 字段 方法 属性 详解 魔数 主副版…...
Flask表单处理与验证
Flask是一个轻量级的Python框架,它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库,用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑,使得表单处理更为简洁和优雅。下面,我们…...
如何通俗易懂的理解 html js css
HTML、CSS 和 JavaScript 是构建网页的三大核心技术。为了通俗易懂地理解它们,我们可以用一个简单的比喻:**盖房子**。 --- ### 1. **HTML:房子的结构** HTML(HyperText Markup Language)就像房子的**骨架**。它定义…...
信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高
《港湾商业观察》施子夫 1月8日,深交所官网显示,浙江信凯科技集团股份有限公司(以下简称“信凯科技”)主板IPO提交注册。 自2022年递交上市申请,信凯科技的IPO之路已走过两年光景,尽管提交注册࿰…...
蓝牙BT04-A的使用与相关AT指令
一、AT指令没有返回的问题及解决方案 检查指令格式: 确认指令格式是否正确,包括特定的命令和结尾的回车换行符(n)。 检查TX/RX连接: 确认TX(发送)和RX(接收)线是否连接正…...
新手如何练习SQL?|掌握
对于新手想要练习SQL语句,可以从以下几个方面入手: 1. 建立理论基础 首先深入理解数据库的核心组件,包括数据库本身、其内部的各个表、表中的字段及其对应的数据类型(如字符串、整型、日期等),以及数据库…...
JavaScript宝典下
小哆啦闭关修炼已久,潜心攻读专业秘技,方才下山考研本欲大展宏图,怎奈山河虽壮志难酬,终是觉察考研无望。思来想去,不若弃考研之念,重拾敲代码之道,复盘前端奇术,以备闯荡职场江湖。…...
浅谈云计算12 | KVM虚拟化技术
KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具(QEMU、Libvirt等) 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…...
Spring Boot 动态表操作服务实现
Spring Boot 动态表操作服务实现 Spring Boot 动态表操作服务实现1. 环境配置2. JdbcTemplate 的使用2.1 创建动态表2.2 动态添加字段2.3 动态删除字段2.4 动态修改字段类型2.5 删除表的方法实现 3. 小结3.1 可能的优化 Spring Boot 动态表操作服务实现 在现代的应用开发中&am…...
62_Redis服务器集群优化
Redis集群虽然具备高可用特性,且能实现自动故障恢复,但是如果使用不当,也会存在一些问题,总结如下。 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题Lua和事务问题1.集群完整性问题 在 Redis 集群的默认配置下,当节点检测到存在至少一个哈希…...
晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...
Linux Top 命令 load average 指标解读
前言 作为平台开发的同学,维护平台稳定性是我们最基本的工作职责,下面主要介绍下top 命令里 ,load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载,它表示运…...
Nacos: 一个动态服务发现与配置管理平台
Nacos: 一个动态服务发现与配置管理平台 引言 在微服务架构日益普及的今天,服务之间的调用和配置管理变得越来越复杂。为了简化这一过程并提高开发效率,阿里巴巴推出了Nacos——一个易于使用的动态服务发现、配置管理和服务管理平台。 Nacos是什么&am…...
SpringBoot + 事务钩子函数
一、案例背景 拿支付系统相关的业务来举例。在支付系统中,我们需要记录每个账户的资金流水(记录用户A因为哪个操作扣了钱,因为哪个操作加了钱),这样我们才能对每个账户的账做到心中有数,对于支付系统而言&…...
OpenCV相机标定与3D重建(56)估计物体姿态(即旋转和平移)的函数solvePnPRansac()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用RANSAC方案从3D-2D点对应关系中找到物体的姿态。 cv::solvePnPRansac 是 OpenCV 中用于估计物体姿态(即旋转和平移)的…...
【JVM中的三色标记法是什么?】
JVM中的三色标记法是什么? 一、基本概念二、标记过程三、优势与问题四、漏标与多标的解决方案三色标记法(Tri-color Marking Algorithm)是Java虚拟机(JVM)中一种用于追踪对象存活状态的垃圾回收算法。 它基于William D. Hana和Mark S. McCulleghan在1976年提出的两色标记法…...
从0开始学习搭网站第二天
前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…...
43.Textbox的数据绑定 C#例子 WPF例子
固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 box和block绑定属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 属性双触发,其中一个更新block的属性 block>指向box的属性 从Textbo…...
钉钉实现第三方登录示例(重复回调问题解析)
钉钉作为专门为企业打造的沟通协助平台,包含的功能很多,考勤打卡,审批,日记,钉盘,钉邮等。基本满足了一些中小企业的大部分工作需求。因此对接钉钉的一些功能模块业务需求在开发中也是比较常见的。钉钉的开…...
Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)
目录 一、案例截图 二、安装OpenLayers库 三、安装Element-UI 四、代码实现 4.1、添加一个点 4.2、删除所有点 4.3、根据经纬度删除点 4.4、给点添加点击事件 4.5、完整代码 五、Gitee源码 一、案例截图 可以新增/删除标记点,点击标记点可以获取到当前标…...
算法妙妙屋-------2..回溯的奇妙律动
回溯算法是一种用于系统性地搜索和解决问题的算法,它以深度优先搜索(DFS)为基础,用来探索所有可能的解决方案。通过递归地尝试候选解并在必要时回退(即“回溯”),它能够高效地解决许多涉及组合、…...
pytest-instafail:让测试失败信息即时反馈
pytest-instafail:让测试失败信息即时反馈 前言一、简介二、优势三、安装与使用3.1 未安装时运行情况3.2 安装3.3 已安装时运行情况3.3 pytest.ini 配置选项 四、对比 总结 前言 当测试用例数量庞大时,定位测试失败的原因往往耗时费力。此时,…...
K8S--配置存活、就绪和启动探针
目录 1 本人基础环境2 目的3 存活、就绪和启动探针介绍3.1 存活探针3.2 就绪探针3.3 启动探针 4 探针使用场景4.1 存活探针4.2 就绪探针4.3 启动探针 5 配置存活、就绪和启动探针5.1 定义存活探针5.2 定义一个存活态 HTTP 请求接口5.3 定义 TCP 的就绪探针、存活探测5.4 定义 g…...
solidity基础 -- 枚举
在智能合约开发领域,Solidity语言因其简洁高效而被广泛使用。其中,枚举(enum)作为一种特殊的数据类型,为合约的状态管理提供了极大的便利。本文将通过一个具体的Solidity合约示例,深入探讨枚举的定义、使用…...