windows xp 驱动开发(四) USB开发技术概述

2023-11-13

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

 

欢迎大家提出意见,一起讨论!

 

参考文章: http://blog.csdn.net/xxxluozhen/article/details/4882121

 

1、  概述

结合LPC2440开发板,编写其USB上位机驱动,旨在增强对USB总线协议的理解和提升WinXP下驱动开发能力。本试验选择实验机作为上位机,操作系统选择大众操作系统(window xp)。

2、 USB相关技术

USB 是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/S。USB支持“总线供电”和“自供电”两种供电模式。在总线供电模式下,

设备最多可以获得500mA 的电流。USB2.0 被设计成为向下兼容的模式,当有全速(USB 1.1)或者低速(USB 1.0)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持它们。一条USB 总线上,可达到的最高传输速度等级由该总线上最慢的设备决定,该设备包括主机、HUB 以及USB 功能设备。

USB 体系包括“主机”、“设备”以及“物理连接”三个部分。其中主机是一个提供USB接口及接口管理能力的硬件、软件及固件的复合体,可以是PC,也可以是OTG设备。一个USB系统中仅有一个USB主机;设备包括USB 功能设备和USB HUB,最多支持127 个设备;物理连接即指的是USB的传输线。在USB 2.0 系统中,要求使用屏蔽的双绞线。

从普通用户的观点来看,USB 的主要特征是每个设备都有同样的四芯电缆及标准化插头(如上图),都可以插入到PC 后部的标准化插座或与PC 相连的某个HUB上。另外,你还可以随意拔插USB设备而不管应用程序是否打开以及是否会造成电气损害。然而对于一个驱动软件开发人员来说,USB 并不像想象的那么简单,了解USB 某些电子和机械概念仍然很重要。

 

2、1     USB的拓朴结构

对于每个PC来说,都有一个或者多个称为Host 控制器的设备,该Host 控制器和一个根Hub(Root Hub)作为一个整体。ROOT HUB是一个特殊的USB HUB,它集成在主机控制器里,不占用地址。

1.        USB Host 控制器:每一个PC的主板上都会有多个Host控制器,这个Host控制器与其它I/O设备一样直接连接到系统总线上,其实它就是一个PCI设备,挂载在PCI总线上。操作系统与主控制器通信使用I/O口或内存寄存器,通过普通的中断信号,系统可以接受主控制器的事件通知。主控制器连接一棵USB 设备树(如图2-1-1)。一种称为hub 的设备作为其它设备的连接点。多个hub 能以菊链方式连接,可以连接到USB规范中定义的最大深度。其它设备,如照相机、麦克风、键盘等等,直接连到hub上。

2.        USB Hub:每一个USB 控制器都会自带一个USB Hub,被称为根(Root)Hub。这个根Hub可以接子(Sub)Hub,每一个Hub 挂载USB 设备。在普通的PC 机当中,一般有8个USB 口,通过外界USB Hub,可以插更多的USB 设备。

3.        USB 设备:USB 设备就是插在USB 总线上工作的设备,广义地讲USB Hub 也算一个USB设备。每个USB Hub下可以直接或者间接地连接127各设备,并且彼此之间不会干扰。对于用回来说,可以看成是USB 设备和USB 控制器直接相连,之间通讯需要满足USB 的通讯协议。

USB设备图说明:以HOST-ROOT HUB为起点, 最多支持7 层(Tier),也就是说任何一个USB系统中最多可以允许5个USB HUB级联。一个复合设备(Compound Device)将同时占据两层或更多的层。

 

2、2 USB数据流模式

USB 采用轮询的广播机制传输数据,所有的传输都由主机发起(即Host向Device发出),任何时刻整个USB 体内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据包。USB采用令牌包”-“数据包”-“握手包的传输机制,在令牌包中指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。握手包表示了传输的成功与否。

管道(Pipe)是主机和设备端点之间数据传输的模型,共有两种类型的管道:无格式的流管道(Stream Pipe)和有格式的信息管道(Message Pipe)

任何USB设备一旦上电就存在一个信息管道,即默认的控制管道,USB主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。

USB 设备连接到HOST 时,HOST 必须通过默认的控制管道对其进行枚举,完成获得其设备描述、进行地址分配、获得其配置描述、进行配置等操作方可正常使用。USB 设备的即插即用特性即依赖于此。

USB 体系在实现时采用分层的结构,如下图(2-2-1)所示:在HSOT 端,应用软件(ClientSW)不能直接访问USB总线,而必须通过USB系统软件和USB主机控制器来访问USB 总线,在USB 总线上和USB 设备进行通讯。从逻辑上可以分为功能层、设备层和总线接口层三个层次。其中功能层完成功能级的描述、定义和行为;设备级则完成从功能级到传输级的转换,把一次功能级的行为转换为一次一次的基本传输;USB总线接口层则处理总线上的Bit 流完成数据传输的物理层实现和总线管理。途中黑色箭头代表真实的数据流,灰色箭头代表逻辑上的通讯。

物理上,USB 设备通过分层的星型总线连接到HOST,但在逻辑上HUB 是透明的,各USB设备和HOST 直接连接,和HOST上的应用软件形成一对一的关系。

各应用软件-功能设备对之间的通讯相互独立,应用软件通过USB设备驱动程序(USBD)发起IRQ请求,请求数据传输主机控制器驱动程序(HCD)接收IRQ请求,并解析成为USB传输和传输事务(Transaction),并对USB系统中的所有传输事务进行任务排定(因为可能同时有多个应用软件发起IRQ请求)。主机控制器(Host Controller)执行排定的传输任务,在同一条共享的USB总线上进行数据包的传输。

USB 系统中数据的传输,宏观的看来是在HOST 和USB 功能设备之间进行;微观的看是在应用软件的Buffer 和USB 功能设备的端点之间进行。一般来说端点都有Buffer,可以认为USB通讯就是应用软件Buffer 和设备端点Buffer 之间的数据交换,交换的通道称为管道。应用软件通过和设备之间的数据交换来完成设备的控制和数据传输。通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输用在一起来对设备进行控制的若干管道称为设备的接口,这就是端点、管道和接口的关系。

一个USB设备可以包括若干个端点,不同的端点以端点编号和方向区分。不同端点可以支持不同的传输类型、访问间隔以及最大数据包大小。除端点0外,所有的端点只支持一个方向的数据传输。端点0是一个特殊的端点,它支持双向的控制传输。管道和端点关联,和关联的端点有相同的属性,如支持的传输类型、最大包长度、传输方向等。

USB 体系定义了四种类型的传输,它们是:

n    控制传输:主要用于在设备连接时对设备进行枚举以及其他因设备而已的特定操作。

n    中断传输:用于对延迟要求严格、小量数据的可靠传输,如键盘、游戏手柄等。

n    批量传输:用于对延迟要求宽松,大量数据的可靠传输,如U 盘等。

n   同步传输用于对可靠性要求不高的实时数据传输,如摄像头、USB音响等

在主机控制器和USB HUB 之间还有另外一种传输——分离传输(Split Transaction),它仅在主机控制器和HUB 之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于USB 设备来说是透明的、不可见的。


2、3 USB四种传输模式

2、3、1 批量传输

批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。

批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。USB 允许连续3 次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。一次批量传输(Transfer)由1 次到多次批量事务传输(Transaction)组成。

批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USB HOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING 操作,向主机报告端点的状态,NYET 表示否定应答,没有准备好接收下一个数据包,ACK表示肯定应答,已经准备好接收下一个数据包。

 

2、3、2 控制传输 

控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。

第一阶段为从HOST 到Device 的SETUP 事务传输,这个阶段指定了此次控制传输的请求类型;

第二阶段为数据阶段,也有些请求没有数据阶段;

第三阶段为状态阶段,通过一次IN/OUT 传输表明请求是否成功完成。

左图为建立阶段的事务传输流程图。可以看出:与批量传输相比,在流程上并没有多大区别,区别只在于该事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。建立阶段过后,可能会有数据阶段,这个阶段将会通过一次或多次控制传输事务,完成数据的传输。同样也会采用PID翻转的机制。建立阶段,Device 只能返回ACK 包,或者不返回任何包。

最后是状态阶段,通过一次方向与前一次相反的控制事务传输来表明传输的成功与否。如果成功会返回一个长度为0 的数据包,否则返回NAK 或STALL。整个控制传输如图2-3-1所示。

控制传输通过控制管道在应用软件和Device 的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。其他三种传输类型都没有格式定义。

 

控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte;对于低速设备该值为8;全速设备可以是8 或16 或32 或64个字节。

控制传输在访问总线时也受到一些限制,如:

n    高速端点的控制传输不能占用超过20%的微帧,全速和低速的则不能超过10%。

n    在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制输。

USB 允许连续3 次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。

 

2、3、3 中断传输

中断传输是一种轮询的传输方式,是一种单向的传输,HOST 通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据,否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。高速中断传输不得占用超过80%的微帧时间,全速和低速不得超过90%。

中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS,低速端点为10~255mS,高速端点为(2interval-1)*125uS,其中interval 取1到16 之间的值。

除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输,高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达3072 字节的图2-3-2为中断事务图,从图中可以看出中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。

2、3、4  同步传输

同步传输是一种实时的、不可靠的传输不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达3072字节的数据。同步传输事务如图2-3-4所示全速同步传输不得占用超过80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。

=====================================================================

USB控制器的工作原理:

当USB控制器从USB总线检测到主机启动的某一传输请求时,USB控制器通过中断方式

将此请求通知主机系统,主机系统通过访问USB控制器的状态寄存器和数据寄存器获得与

此次传输有关的各种参数;

并根据具体传输参数,对USB控制寄存器和数据寄存器进行相应

的操作,以完成主机的传输请求.

2、4  USB协议层规范

2、4、1 分层的协议

    可以分为三个层次,即最底层USB总线接口层USB设备层功能通信层

以USB摄像头为例,USB驱动调度Host控制器向USB摄像头发出请求。每个USB设备有多个管道,使用哪个生产管道,传输大小都要指定。

而在USB设备一端会有小单片机或者处理芯片负责响应这种请求。

 

2、4、2 数据格式

USB 采用little edian字节顺序,在总线上先传输一个字节的最低有效位,最后传输最高有效位,采用NRZI编码,若遇到连续的61要求进行为填充,即插入一个0

 

(1)  所有的USB 包都由SYNC开始,高速包的SYNC宽度为32bit,全速/低速包的SYNC段度为8bit。实际接收到的SYNC长度由于USB HUB的关系,可能会小于该值。

(2)  PID 表征了数据包的类型,分为令牌(Token)、数据(Data)、握手(Handshacke)以及特殊包4大类,共16种类型的PID

PID这个字段对理解信息包到关重要。USB协议规定数据传输由事务(Transactiion)组成, 而事务由信息包组成。

大量的事务包含三个信息包: 令牌信息包、数据信息包和握手信息包。

信息包根据PID字段来区分不同类型。

(2.1) 对于令牌包来说,PID 之后是7位的地址和4位的端点号。令牌包没有数据域,以5位的CRC 校验和结束。SOF 是一类特殊的令牌包,PID 后跟的是11位的帧编号。

令牌信息包括四种类型:

(2.1.1)   OUT  表示主机输出数据到设备;

(2.1.2)   IN     表示主机从设备读取数据;

(2.1.2)   SOF  表示帧号开始;

(2.1.3)   SETUP 专用于控制传输的设置事务。

(2.2) 对于数据包来说,PID 之后直接跟数据域,数据域的长度为N 字节,数据域后以16 位的CRC校验和结束。

(2.3) 握手包仅有PID 域,没有数据也没有校验和。

分离传输会用到一类特殊的包,Start-Split 和Complete-Split 包,格式如下:

在Start-Split 和Complete-Split 包中主要指定了此次分离传输所在的HUB 的地址和下行端口编号以及端点类型(控制、中断、批量、同步)。以及此次传输中数据包在整个数据中的位置(第一个包、中间的包、末尾的包)。

握手包包括ACKNAKSTALL以及NYET四种,其中ACK 表示肯定的应答,成功的数据传输;NAK 表示否定的应答,失败的数据传输,要求重新传输;STALL 表示功能错误或端点被设置了STALL 属性;NYET 表示尚未准备好,要求等待。

数据在USB 总线上的传输以为单位,包只能在帧内传输。高速USB总线的帧周期为125uS,全速以及低速USB总线的帧周期为1mS。帧的起始由一个特定的包(SOF)表示,帧尾为EOFEOF 不是一个包,而是一种电平状态,EOF 期间不允许有数据传输。

(3)   地址字段,用于指明USB主机究竟是要和哪个设备通信,设备的地址初始默认为0,主机会在设备检测阶段给设备分配一个地址。
(4)   端点字段,用于指明USB主机究竟是要和设备的哪个端点进行通信。如前所述,一个设备可以有多个端点。
(5)   帧号码字段,USB主机把USB总线上的实际数据传输按时间分割成一块块的帧(Frame)或微帧(Micro Frame)。对于全速和低速的设备,主机将传输分成1帧,           对于高速设备主机将传输分成125微秒的微帧。帧号码字段就是用于识别特定的帧或微帧,它由硬件自动处理。
(6)   数据字段,为实际要传输的数据。
(7)   校验字段,用于信息包的数据校验,它由硬件自动处理。

2、4、3  事务


 USB协议规范将事务定义为“将一个服务传送到一个端点”,这里的服务指的是主机传送信息给设备,或是主机从设备接收信息。每一个传输可以包含一笔或多笔事务,而每一笔事务可以包含一个、二个或三个信息包,可以把信息包理解为数据传输物理上的基本单位。大部分事务都包含三个信息包:令牌信息包、数据信息包和联络信息包。

每一种传输类型(控制、中断、批量以及同步)包含一个或多个阶段,而每一个阶段包含一个或多个事务

在控制传输中,一般包含设置事务阶段(对应于设置事务类型)、数据阶段(对应于输入或输出事务类型)以及状态阶段(对应于输入或输出事务类型,以表明整个控制传输是否成功);

而中断、批量以及同步传输中只包含数据阶段。

 

 2.5  控制器的固件编程
 USB接口芯片收到数据或发送出数据后都会产生中断,所以固件编程的核心就是编写中断服务程序。这项工作主要就是根据相关寄存器的标志来对各个端点缓冲区的数据进行处理。可以把中断服务程序分为一些功能模块(函数)来考虑:

(1)端点0的响应。当设备插上USB接口后,主机会发出一系列的请求给设备的端点0,设备的固件程序应该能在端点0对这些要求进行正确响应。

(2)其他端点的数据通信过程。通过(1)主机就能知道设备端点的使用情况,以后就可以通过其他端点以设定的传输方式来交换数据。

(3)实现设备类别遵循的协议规范。例如,如果要设计U盘,则U盘的固件程序就要实现对Mass Storage Class规范中的UFI命令规范的支持。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows xp 驱动开发(四) USB开发技术概述 的相关文章

  • Delphi XE 和使用 OnKeyDown 捕获箭头键

    我希望我的表单能够处理箭头键 而且我可以做到 只要表单上没有按钮 为什么是这样 关键消息由接收这些消息的控件本身进行处理 这就是为什么当您使用按钮时表单不会接收消息 因此 通常您必须对这些控件进行子类化 但 VCL 足够友好地询问父子表单如
  • 为 Windows 7 构建自定义凭据提供程序

    在查看了为 Windows 7 构建自定义凭据提供程序的代码后 我设法让自己的磁贴显示在登录屏幕上 并且可以作为所需用户登录 但是 我正在尝试实现一个系统 其中事件 范围内的蓝牙设备 触发登录 解锁 而无需单击磁贴 我可以设置它自动填写密码
  • 如何解决 docker 中的 python 应用程序中的 pywin32 依赖项?

    我有一个 python 3 6 应用程序 必须构建和导入 c 库 并通过 Windows 服务部署多个 celery 工作人员 该应用程序部署在 Windows 虚拟机上的 azure 上 但我必须弄清楚如何创建一个独立于平台的 docke
  • 如何在windows上安装mongoDB?

    我正在尝试测试 mongoDB 看看它是否适合我 我下载了 32 位 Windows 版本 但不知道如何继续 我通常使用 WAMP 服务在本地计算机上进行开发 我可以在 Wamp 上运行 mongoDB 吗 但是 使它在 Windows 上
  • 使用 Python 的 Windows 桌面 GUI 自动化 - 睡眠与紧密循环

    我正在使用 Python 的 PyAutoGUI 库来自动化 GUI 在当前窗口上完成数据输入后 我正在自动化的应用程序会打开一个新窗口 一切都由 python 自动化处理 当前窗口中的数据输入以及打开窗口所需的单击 在当前窗口中执行单击时
  • 在 Linux 中生成相同的数字,但在 Windows 中则不然

    下面的代码旨在生成区间 1 100 中的五个伪随机数的列表 我播种default random engine with time 0 它返回系统时间UNIX时间 https en wikipedia org wiki Unix time 当
  • Visual Studio Code 安装位置

    我几天前安装了 Visual Studio Code 但现在在我的计算机上找不到可执行文件 它在哪里 我已经检查了程序和功能 我还检查了我的路径 由于某种原因 它也不在其中 更新 10 11 2018 如果您进行完全重新安装 包括卸载计算机
  • 将响应缓冲区转换为 JSON

    在 AWS 中 我使用 https 模块通过 Lambda 发出 get 请求 我能够返回数据 但当我调用时它是缓冲区格式的callback null obj https get options res gt res on data d g
  • 如何使用 C++ 获取 Windows 中的应用程序数据路径?

    我查遍了互联网 似乎没有找到合适的解决方案 我希望能够在 C 中以编程方式获取路径 ALLUSERSPROFILE Application Data 资源管理器可以将其转换为真实路径 我可以在不依赖第三方代码的情况下做到这一点吗 Use S
  • 让所有进程并行

    我正在尝试使用 C 的 TPL 并行获取所有进程的 CPU 我的代码是 private IDictionary
  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • Windows 7 跳转列表(Windows 窗体、C#)

    有谁知道如何在 C 中自定义与我自己的应用程序相关的 Windows 跳转列表功能 我知道可以做到 但我在 MSDN 上找不到任何与 C Windows7 相关的内容 到目前为止 我能找到的与 W7 和 C 相关的唯一信息只是我已经阅读过的
  • Rails 控制台在 Windows 中失败并显示“切换到检查模式”

    我创建了一个 Rails 项目rails new foo then cd foo 然后运行rails c 然后我收到这样的消息 DL is deprecated please use Fiddle Loading development e
  • 只响应第一个 WM_KEYDOWN 通知?

    Win32 应用程序如何仅响应第一个 WM KEYDOWN 通知 MSDN 文档声称第 30 位 指定先前的按键状态 如果在发送消息之前按键处于按下状态 则该值为 1 如果按键处于按下状态 则该值为 0 但在我的 WndProc 中 第 3
  • Windows批处理文件-显示所有子文件夹

    我在使用 Windows 批处理文件返回 JUST 文件夹 忽略文件 时遇到困难 这就是我现在所拥有的 目前它正在返回文件和子子文件夹 for r g in xx do echo g 另外 假设我只想返回以几个不同前缀开头的文件夹 例如 我
  • RSA_public_decrypt 和 MS Crypto API 等效项

    我正在尝试开发许可证验证解决方案 许可证使用 OpenSSL 在服务器上进行编码RSA private encrypt功能 对于 Mac OS X 使用RSA public decrypt它就像一个魅力 在 Windows 上 我必须使用非
  • 套接字是否可以仅针对 recv() 函数设为非阻塞?

    我希望能够打电话recv 不必阻塞 所以我想让它成为非阻塞 但我不希望它在发送数据时是非阻塞的 那么能否将套接字设为非阻塞 recv 函数 或者阻塞 非阻塞模式是否影响所有套接字函数 对于 Windows 您可以使用ioctlsocket
  • 通过从 .BAT 中查找进程正在使用的端口来终止进程

    在 Windows 中 什么可以查找端口 8080 并尝试通过 BAT 文件终止它正在使用的进程 打开命令提示符并运行以下命令 C Users username gt netstat o n a findstr 0 0 3000 TCP 0
  • 在 C# 中创建 Cron 作业

    我正在用 C 编写一个调度类型应用程序 并允许用户存储他们想要在特定时间运行的任务 现在 我为他们提供了指定运行频率 每日 每周 每月 以及指定时间的选项 然后将其存储在数据库中 我在理解其背后的伪代码时遇到了一些麻烦 并且正在寻找一些有关
  • 如何远程获取系统的网络共享和连接?

    我正在寻找一种远程获取类似于以下控制台应用程序的信息的方法 net use 净份额 网络统计 ano 但是 我需要能够在系统上运行第三方应用程序的情况下执行此操作 这有效地排除了使用 psexec 远程执行命令 因为 psexec 将作为服

随机推荐

  • 人工智能数学基础8:两个重要极限及夹逼定理

    点此跳转到老猿Python博文目录 一 极限公式1 二 极限公式2 e为常数2 71828 变体 使用案例 三 夹逼定理 夹逼定理英文原名Squeeze Theorem 也称两边夹定理 夹逼准则 夹挤定理 挟挤定理 三明治定理 是判定极限存
  • JAVA程序设计:最短回文串(LeetCode:214)

    给定一个字符串 s 你可以通过在字符串前面添加字符将其转换为回文串 找到并返回可以用这种方式转换的最短回文串 示例 1 输入 aacecaaa 输出 aaacecaaa 示例 2 输入 abcd 输出 dcbabcd 思路 这题O N 2
  • python-selenium-运行js代码--下拉操作

    使用python selenium运行js代码完成下拉操作 在某些情况 当我们下拉到浏览器 浏览器才会给我们加载数据 所有我们需要js带代码 driver execute script 写入你要执行的js代码 下拉的js代码 documen
  • 什么是CRUD( What is CRUD)?

    在很多技术性的文章 特别是有关数据库类的文章中 经常会看到一个缩写 CRUD 那什么是CRUD呢 CRUD其实是数据库基本操作中的Create 创建 ReadRetrieve 读取 Update 更新 Delete 删除 而这里的Creat
  • pycharm中pygame模块的安装与用法

    一 pygame的安装 本文章主要展示pycharm中的pygame模块的安装 打开pycharm 在左上角点file 找到settings 如图 进入后 找到Project untitled下的Project interperter 右边
  • 谷歌VAD静音检测py-webrtcvad使用详解

    一 前言 不知道有没有人和我一样看的官方示例一脸蒙 什么采样率除以时间 看到就头大 还是英文头更大了 好了废话结束 上翻译改编版 二 人话翻译版代码 如果你问我有些行为什么没有注释 import collections import con
  • 小记stm32实现串口接收的四种方法(hal库)

    开发环境 STM32CUBMX 正点原子STM32F407ZGT6探索者开发板 MDK ARM 5 31 第一种方式 直接接收 配置外部时钟源 2 配置时钟树 3 配置串口一 生产代码后进入工程 重定向printf到串口1 建议在usart
  • 攻防世界(pwn)Recho(XCTF 3rd-RCTF-2017) writeup

    64位程序 保护如上 可以分析出程序大意 先读取字符串长度存入nptr与v7中 如果字符串长度小于15时将v7设为16 大于15则不变 然后读取v7个字符放入buf中 最后在末尾添上0并打印出来 漏洞很显然 如果v7很大 则read会造成溢
  • ChatGPT实战:创业咨询,少走弯路,少踩坑

    用九死一生形容创业再适合不过 不过一旦成功回报也很诱人 这也是为什么那么多人下场创业 纸上得来终觉浅 绝知此事要躬行 创过业的人都知道其中的心酸 而他们也建议你去创业 因为那真不是一般人能干的事 又想创业 又想少踩坑 创业者肯定是想多向走过
  • Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自 http xiaozu renren com xiaozu 106512 336681453 function center U obj fcn FCMClust data cluster n
  • 实习僧-竞品分析报告

    找工作是应届毕业生们绕不开的话题 本文从PEST分析 行业概况 用户体验等角度 做了一份实习僧vs前程无忧的竞品分析报告 一 报告概述 1 体验环境 产品体验 软件版本 实习僧 4 14 0 前程无忧学生版1 2 0 手机系统 Harmon
  • cadence OrCAD原理图输出-pdf文件和bom表

    软件版本 16 6 一 输出pdf文件 生成pdf文件前 需要首先安装好pdf虚拟打印机 在打印时选择pdf打印机即可 在项目管理中 选择dsn文件 主菜单file gt print 选项 出现打印机对话框 默认 scale to pape
  • R语言-ggplot2图形语法

    简介 在R里 主要有两大底层图层系统 一是base图形系统 二是gird图形系统 lattice包与ggplot2包正是基于gird图形系统构建的 他们都有自己独特的图形语法 ggplot2有着自己独特的图形语法 这套语法归纳起来包括 数据
  • 魅族满载诚意强势回归,重启全胜时代?

    3月30日魅族在上海梅赛德斯 奔驰文化中心举办了史上最大规模的新品发布会 吸引了众多媒体 行业人士和魅友的关注 在发布会上 魅族正式推出了魅族20系列旗舰手机 以及Flyme 10系统 Flyme Auto车机系统等全场景融合体验产品 全方
  • JS 随机生成十个带颜色的li

    html和css部分
  • 量化投资学习-37:底部涨停板操作

    涨停板选股 1 异动 主力的拉升前的筹码集中度和压力试盘 金针探底 拉升回落 2 时间 10 00之前涨停最佳 10 30之前凑合 下午不可 3 空间 底部第一个涨停 后续还有较大的涨幅空间 4 缺口 通过缺口 快速脱离主力的成本区和价格底
  • java注解开发

    用xml配置文件方式是Servlet2 5版本规范的 经过逐步演变注解来时流行 因为更方便了 Servlet3 0以后也支持注解开发了 自动注解实现步骤 创建JavaWeb工程 并移除web xml 编写Servlet 继承HttpServ
  • react学习笔记-从井字棋开始(3)

    函数函组件 如果你想写的组件只包含一个 render 方法 并且不包含 state 那么使用函数组件就会更简单 我们不需要定义一个继承于 React Component 的类 我们可以定义一个函数 这个函数接收 props 作为参数 然后返
  • 120种小狗图像傻傻分不清?用fastai训练一个分类器

    作者 一杯奶茶的功夫 链接 https www jianshu com p ab35ed21df87 程序员转行学什么语言 https edu csdn net topic ai30 utm source csdn bw 这篇文章会讲解如何
  • windows xp 驱动开发(四) USB开发技术概述

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 参考文章 http blog csdn net xxxluozhen article details 4882121 1 概