Windows下usb接口驱动技术(一)

Windows下usb接口芯片的驱动技术
一、        USB概述
 

USB的英文全称为Universal Serial Bus,中文含义是通用串行总线,是由Conpaq、DEC、IBM、Inter、Microsoft、NEC和Northen Telecom等公司为简化PC与外设之间的互连而共同研究开发的一种免费的标准化连接器,它支持各种PC与外设之间的连接,还可实现数字多媒体集成。现在生产的PC几乎都配备了USB接口,Microsoft 的Windows98、NT以及MacOS、Linux、FreeBSD等流行操作系统都增加了对 USB的支持。它是一种快速的,双向的,同步传输的廉价的并可以进行热拔插的串行接口。USB接口使用方便,它可以连接多个不同的设备,而过去的串口和并口只能接一个设备。速度快是USB技术的突出特点之一。全速USB接口的最高传输率可达12Mb/s,比串口快了整整100倍,USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,.这使得高分辨率、真彩色的大容量图象的实时传送成为可能。USB接口支持多个不同设备的串列连接,一个USB接口理论上可以连接127个USB设备。连接方式也十分灵活,既可以使用串行连接,也可以使用集线器(Hub)把多个设备连接在一起,再同PC机的USB接口相接。普通的使用串口、并口的设备都需要单独的供电系统,而USB设备则不需要。正是由于USB的这些特点,使其获得了广泛的应用。

二、        USB的总线结构


USB的总线结构是采用阶梯式星形(tiered star)的拓扑(topology)结构,如上图和下图所示。每一个星形的中心是集线器,而每一个设备可以通过集线器上的接口来加以连接。从图中可以看到USB的设各包含了两种类型:USB集线器与USB设备。位于最顶端的就是Host(主机端)。从Host的联机往下连接至Hub(集线器),再由集线器按阶梯式以一层或一阶的方式往下扩展出去,连接在下一层的设备或另一个集线器上。事实上,集线器也可视为一种设备。而其中最大层数为6层(包括计算机内部的根集线器)。每一个星形的外接点的数目可加以变化,一般集线器具有2、4或7个接口。


在此的主机端通常是指PC主机。当然,主机端因具有根集线器,因此也含有集线器的功能。而集线器是在USB规范中特别定义出来的外围设备,除了扩增系统的连接点外,还负责中继(repeat)上端/下端的信号以及控制各个下端端口的电源管理。至于另一个设备,即是用户常见的外围设备。但在USB规范书中,称这种设备为“功能”(functions),意味着此系统提供了某些“能力”,例如具有键盘或鼠标等功能。当然不同的外围设各可以具有不同的功能。通过这种阶梯式星形的连接方式,最多可同时连接到127个设备。

三、        USB结构与工作原理
一个USB系统可以从三个方面加以描述:

(1)USB互联。

(2)USB设备。

(3)USB主机。

USB互联是指一个USB设备与USB主机相联并和其通信的方式,它包括:

(1)总线拓扑结构:USB主机和USB设备的连接模型。

(2)层间关系:USB在系统中的每一层都要完成一定的任务。

(3)数据流模型:USB系统中信源和信息之间的数据传送方式。

(4)任务规划:USB提供可以共享的互联机制。通过规划对互连机制的访问,可以支持同步数据传输。

四、        USB硬件结构
 

一个USB系统包含三类硬件设备: USB主机(USB HOST)、 USB设备(USB DEVICE)、USB集线器(USB HUB)。

  (1)USB HOST

在一个USB系统中,当且仅当有一个USB HOST时,USB HOST有以下功能:

Ø  管理USB系统;

Ø  每毫秒产生一帧数据;

Ø  发送配置请求对USB设备进行配置操作;

Ø  对总线上的错误进行管理和恢复。

  (2)USB DEVICE

在一个USB系统中,USB DEVICE和USB HUB总数不能超过127个。USB DEVICE接收USB总线上的所有数据包,通过数据包的地址域来判断是不是发给自己的数据包:若地址不符,则简单地丢弃该数据包;若地址相符,则通过响应USB HOST的数据包与USB HOST进行数据传输。

  (3)USB HUB

  USB HUB用于设备扩展连接,所有USB DEVICE都连接在USB HUB的端口上。一个USB HOST总与一个根HUB (USB ROOT HUB)相连。USB HUB为其每个端口提供100mA电流供设备使用。同时,USB HUB可以通过端口的电气变化诊断出设备的插拔操作,并通过响应USB HOST的数据包把端口状态汇报给USB HOST。一般来说,USB设备与USB HUB间的连线长度不超过5m,USB系统的级联不能超过6级(包括ROOT HUB)。

USB总线最多可支持127个USB外设连接到计算机系统。USB的拓扑是树形结构,有1个USB根集线器(root hub),下面还可有若干集线器。1个集线器下面可接若干USB接口。USB线缆包括4条线:Vbus(USB电源)、D+(数据)、D-(数据)和 Gnd(USB地)。线缆最大长度不超过5m。USB1.1的传输速率最高为12Mb/s(低速外设的标准速率为1.5Mb/s,高速外设的标准速率为 12Mb/s)。USB外设可以采用计算机里的电源(+5V,500mA),也可外接USB电源。在所有的USB信道之间动态地分配带宽是USB总线的特征之一,这大大地提高了USB带宽的利用率。当一台USB外设长时间(3ms以上)不使用时,就处于挂起状态,这时只消耗0.5mA 电流。按USB1.0/1.1标准,USB的标准脉冲时钟频率为12MHz,而其总线时脉冲时钟为1ms(1kHz),即每隔1ms,USB器件应为 USB线缆产生1个时钟脉冲序列。这个脉冲系列称为帧开始数据包(SOF)。高速外设长度为每帧12000bit(位),而低速外设长度只有每帧 1500bit。1个USB数据包可包含0~1023字节数据。每个数据包的传送都以1个同步字段开始。

五、        USB的数据流
主控制器负责主机和USB设备间数据流的传输。这些传输数据被当作连续的比特流。每个设备提供了一个或多个可以与客户程序通信的接口,每个接口由0个或多个管道组成,它们分别独立地在客户程序和设备的特定终端间传输数据。USBD为主机软件的现实需求建立了接口和管道,当提出配置请求时,主控制器根据主机软件提供的参数提供服务。

USB支持四种基本的数据传输模式:控制传输,等时传输,中断传输及数据块传输。每种传输模式应用到具有相同名字的终端,则具有不同的性质。

控制传输类型:支持外设与主机之间的控制,状态,配置等信息的传输,为外设与主机之间提供一个控制通道。每种外设都支持控制传输类型,这样主机与外设之间就可以传送配置和命令/状态信息。等时传输类型:支持有周期性,有限的时延和带宽且数据传输速率不变的外设与主机间的数据传输。该类型无差错校验,故不能保证正确的数据传输,支持像计算机-电话集成系统(CTI)和音频系统与主机的数据传输。

中断传输类型:支持像游戏手柄,鼠标和键盘等输入设备,这些设备与主机间数据传输量小,无周期性,但对响应时间敏感,要求马上响应。

数据块传输类型:支持打印机,扫描仪,数码相机等外设,这些外设与主机间传输的数据量大,USB在满足带宽的情况下才进行该类型的数据传输。

USB采用分块带宽分配方案,若外设超过当前带宽分配或潜在的要求,则不能进入该设备。同步和中断传输类型的终端保留带宽,并保证数据按一定的速率传送。集中和控制终端按可用的最佳带宽来传输传输数据。

六、        USB外设控制器的两种实现方式
USB芯片在外设领域的应用面很广。USB外设控制芯片通常包括USB收发器、串行接口引擎(SIE)、USB控制器和外设功能等四个模块(SIE 主要以硬件方式处理大多数USB协议,USB控制器负责与PC交互通信信息)。USB控制器一般有两种类型:一种是MCU集成在芯片里面的,如 Intel的8X930AX、CYPRESS的EZ-USB、SIEMENS的C541U以及 MOTOLORA、National Semiconductors等公司的产品;另一种就是纯粹的USB接口芯片,仅处理 USB通信,如PHILIPS的PDIUSBD11(I2C接口)、 PDIUSBP11A、PDIUSBD12(并行接口),National Semiconductor的USBN9602、USBN9603、USBN9*等。

集成MCU的USB控制芯片优点是CPU与控制器在同一片芯片里,CPU只需要访问一系列寄存器和存储器,便可实现USB口的数据传输,最大限度的发挥 USB高速的特点。而且简化了程序的设计,极大地降低了USB外设的开发难度。缺点是灵活性不够高,开发成本较大。

纯粹的USB接口芯片的优点是系统组成灵活,可根据不同的系统需求,搭配不同的MCU,具有较高的性能价格比。但因为USB控制器是通过串行口或并行口与MCU连接,在传输速度方面和开发难度方面不如集成了MCU的控制芯片。

不同的实现方式在设计开销、上市时间、元器件开销和引脚数方面各有优劣,选择不同的方案意味着在以上各项指标中进行取舍。如PHILIPS公司的PDIUSBD12器件。该芯片是一款性价比很高的USB器件,它通常用作微控制器系统中实现与微控制器进行通信的高速通用并行接口,设计者可根据需要选择合适的微控制器,灵活性较大,适用于开发低成本且高效的USB外围设备。

七、        USB设备的枚举过程
USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。


一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。然后主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。所有的USB设备必须支持标准请求(Standard Requests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。

当枚举完成后,这个新添加的设备可在Windows的设备管理器里面看到,当用户删除这个设备/硬件时,系统把这个设备从设备管理器里删除。

对于一般的设备,固件(Firmware)内包含主机所要请求的信息,而有些设备则是完全由硬件来负责响应主机的请求。在主机方面则是由操作系统而非应用程序负责处理相关枚举操作。

枚举步骤

USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态 的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态和挂起状态(Suspend))。

USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态和挂起状态(Suspend))。

下面步骤是Windows系统下典型的枚举过程,但是固件不能依此就认为所有的枚举操作都是按照这样一个流程行进。设备必须在任何时候都能正确处理所有的主机请求。

1.用户把USB设备插入USB端口或给系统启动时设备上电。

这里指的USB端口指的是主机下的根hub或主机下行端口上的hub端口。Hub给端口供电,连接着的设备处于上电状态。

2.Hub监测它各个端口数据线上(D+/D-)的电压

在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口(全速、高速设备的区分在我将来的文章中描述)。如下图。

检测到设备后,hub继续给设备供电,但并不急于与设备进行USB传输。

3. Host了解连接的设备。

每个hub利用它自己的中断端点向主机报告它的各个端口的状态(对于这个过程,设备是看不到的,也不必关心),报告的内容只是hub端口的设备连接/断开的事件。如果有连接/断开事件发生,那么host会发送一个 Get_Port_Status请求(request)以了解更多hub上的信息。Get_Port_Status等请求属于所有hub都要求支持的hub类标准请求(standard hub-classrequests)。

4.Hub检测所插入的设备是高速还是低速设备。

hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。(USB 2.0规范要求速度检测要先于复位(Reset)操作)。

5.hub复位设备。

当主机获悉一个新的设备后,主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位其管理的端口。hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不受影响。

6.Host检测所连接的全速设备是否是支持高速模式。

因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。

同样的,从设备的角度来看,如果是一个高速设备,在刚连接bub或上电时只能用全速信号模式运行(根据USB 2.0协议,高速设备必须向下兼容USB 1.1的全速模式)。随后hub会进行高速检测,之后这个设备才会切换到告诉模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。

7. Hub建立设备和主机之间的信息通道。

主机不停得向hub发送 Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。

当hub撤销了复位信号,设备就处于默认/空闲状态(Default state),准备着主机发来的请求。设备和主机之间的通信通过控制传输,默认地址0,端点号0进行。在此时,设备能从总线上得到的最大电流是100mA。

8.主机发送Get_Descriptor请求获取默认管道的最大包长度。

默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有位分配地址的设备都是通过地址0来获取主机发来的信息,但由于枚举过程不是多个设备并行处理,而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。

设备描述符的第8字节代表设备端点0的最大包大小。对于Windows系统来说,Get_Descriptor请求中的wLength一项都会设为64,虽然说设备所返回的设备描述符(Device Descriptor)长度只有18字节,但系统也不在乎,此时,描述符的长度信息对它来说是最重要的,其他的瞄一眼就过了。Windows系统还有个怪癖,当完成第一次的控制传输后,也就是完成控制传输的状态阶段,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求)。再次复位的目的是使设备进入一个确定的状态。

9.主机给设备分配一个地址。

主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

10.主机获取设备的信息。

主机发送 Get_Descriptor请求到新地址读取设备描述符,这次主机发送Get_Descriptor请求可算是诚心,它会认真解析设备描述符的内容。设备描述符内信息包括端点0的最大包长度,设备所支持的配置(Configuration)个数,设备类型,VID(Vendor ID,由USB-IF分配), PID(Product ID,由厂商自己定制)等信息。Get_Descriptor请求(Device type)和设备描述符(已抹去VID,PID等信息)之后主机发送Get_Descriptor请求,读取配置描述符(Configuration Descriptor),字符串等,逐一了解设备更详细的信息。事实上,对于配置描述符的标准请求中,有时wLength一项会大于实际配置描述符的长度(9字节),比如255。这样的效果便是:主机发送了一个Get_Descriptor_Configuration 的请求,设备会把接口描述符,端点描述符等后续描述符一并回给主机,主机则根据描述符头部的标志判断送上来的具体是何种描述符。

11.主机给设备挂载驱动(复合设备除外)。

主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备。在驱动的选择过程中,Windows系统会和系统inf文件里的厂商ID,产品ID,有时甚至用到设备返回来的产品版本号进行匹配。如果没有匹配的选项,Windows会根据设备返回来的类,子类,协议值信息选择。如果该设备以前在系统上成功枚举过,操作系统会根据以前记录的登记信息而非inf文件挂载驱动。当操作系统给设备指定了驱动之后,就由驱动来负责对设备的访问。对于复合设备,通常应该是不同的接口(Interface)配置给不同的驱动,因此,需要等到当设备被配置并把接口使能后才可以把驱动挂载上去。

      设备-配置-接口-端点关系见下图:

实际情况没有上述关系复杂。一般来说,一个设备就一个配置,一个接口,如果设备是多功能符合设备,则有多个接口。端点一般都有好几个,比如Mass Storage设备一般就有两个端点(控制端点0除外)。

12. 设备驱动选择一个配置。

驱动(注意,这里是驱动,之后的事情都是有驱动来接管负责与设备的通信)根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置(Configuration)作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态,当然,设备也应该使能它的各个接口(Interface)。

             对于复合设备,主机会在这个时候根据设备接口信息,给它们挂载驱动。

13. 设备可使用。

                     至此,步骤完成,设备可用了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sshhbb/archive/2010/12/31/6109444.aspx

转载于:https://www.cnblogs.com/shanghe/archive/2011/04/15/2017329.html

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

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

相关文章

LeetCode 363. 矩形区域不超过 K 的最大数值和(DP+set二分查找)

1. 题目 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。 示例: 输入: matrix [[1,0,1],[0,-2,3]], k 2 输出: 2 解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2, 且 2 是不超过 k 的最大数字(k 2…

实体框架的惨痛教训

个人评价:通过半年的开发,项目已经运营.但回想起来,整个项目中遇到了许多的问题,还好需求策划上一直很好(原因在于老板原来就是一个产品总监且目前的策划都很有逻辑性),所以对于开发人员而言没有吃苦.问题在于微软的实体框架EF让人简直痛恨至极(个人愚见),让我们浪费了大量时间…

LeetCode 第 27 场双周赛(1125/1966,前57.2%)

文章目录1. 比赛结果2. 题目1. LeetCode 5408. 通过翻转子数组使两个数组相等 easy2. LeetCode 5409. 检查一个字符串是否包含所有长度为 K 的二进制子串 medium3. LeetCode 5410. 课程安排 IV medium (Floyd-Warshall)4. LeetCode 5411. 摘樱桃 II hard…

LeetCode 1464. 数组中两元素的最大乘积

1. 题目 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。 示例 1: 输入:nums [3,4,5,2] 输出:12 解释:如果选择下标…

修改mysql文件的存储路径

使用本地数据库时,常常会发生磁盘爆满变红的情况,特别是C盘,这时候我们希望将mysql本地数据库存储的文件移动到D盘或者E盘,下面是手动调整的办法:1.关闭mysql服务; 左下角开始处输入“服务”,回…

Dynamic programming solving ULS

转载于:https://www.cnblogs.com/elitez/archive/2011/04/21/2024095.html

Excel里,vlookup函数各种应用-匹配多列、多条件匹配

1.vlookup函数常规应用:一个条件匹一列数据; 示例公式:VLOOKUP(A2,test!$A$2:$B$53,2,0) 其中:A2是目标表的匹配条件(学号);test!$A$2:$B$53是被匹配表的数据列;2是指被匹配数据列…

mysql提取各种数据时间的各种方法

1.提取数据的年月日(eg:2018-06-21)方法1:SUBSTR(time FROM 1 FOR 10);方法2:DATE(time);方法3:DATE_FORMAT(time,%Y-%m-%…

LeetCode 1466. 重新规划路线(DFS/BFS)

文章目录1. 题目2. 解题2.1 DFS2.2 BFS1. 题目 n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。 去年,交通运输部决定重新…

解决The total number of locks exceeds the lock table size错误

mysql在进行大批量的数据操作时,会报“The total number of locks exceeds the lock table size”,特别是执行create、update语句的时候, 在出现错误的那段查询语句之前写上这么一句话: show variables like "%_buffer%"…

MySQL 基本查询、条件查询、投影查询

文章目录1. 基本查询2. 条件查询3. 投影查询练习 LeetCode 595. 大的国家练习 LeetCode 584. 寻找用户推荐人练习 LeetCode 1173. 即时食物配送 I练习 LeetCode 610. 判断三角形学习自 廖雪峰的官方网站 1. 基本查询 SELECT * FROM <表名>*表示所有内容 许多检测工具…

开始android旅程

这算是我第一个技术类的博客了&#xff0c;因为小女不才&#xff0c;很多东西都得需要学习&#xff0c;最近发表的一些日志可能是转载或者部分转载&#xff0c;但是我会努力认真的写我的学习心得的&#xff5e;&#xff5e; 这也算是我程序员成长的记录吧&#xff5e;转载于:ht…

解决mysql导出scv文件乱码、蹿行的问题

工作原因&#xff0c;常常不能实现完全的线上化&#xff08;即&#xff0c;所有数据都在线上完成&#xff0c;不需要导入导出&#xff09;&#xff0c;而导出Excel常常比修炼成仙还慢&#xff0c;因此&#xff0c;我们将数据库文件导出到本地使用的时候&#xff0c;常常使用的方…

MySQL 排序、分页查询、聚合查询

文章目录1. 排序2. 分页查询3. 聚合查询3.1 分组聚合 GROUP BY练习 LeetCode 176. 第二高的薪水练习 LeetCode 177. 第N高的薪水练习 LeetCode 182. 查找重复的电子邮箱练习 LeetCode 620. 有趣的电影练习 LeetCode 183. 从不订购的客户练习 LeetCode 596. 超过5名学生的课练习…

1799

/* 简单的数学几何题 */// include file #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <ctime>#include <iostream> #include <sstream> #include <fstream>…

解决mysql导数据时,格式不对、导入慢、丢数据的问题

如果希望一劳永逸的解决慢的问题&#xff0c;不妨把你的mysql升级到mysql8.0吧&#xff0c;mysql8.0默认的字符集已经从latin1改为utf8mb4&#xff0c;因此现在UTF8的速度要快得多&#xff0c;在特定查询时速度提高了1800&#xff05;&#xff01; mysql8.0 安装教程但是如果时…

MySQL 多表查询、连接查询(内连接、外连接)

文章目录1. 多表查询2. 连接查询练习 LeetCode 175. 组合两个表练习 LeetCode 181. 超过经理收入的员工练习 LeetCode 1378. 使用唯一标识码替换员工ID练习 LeetCode 1068. 产品销售分析 I练习 LeetCode 1069. 产品销售分析 II练习 LeetCode 1303. 求团队人数练习 LeetCode 135…

屏蔽非法路由,好好上网!

学校有人用路由&#xff0c;我人品差&#xff0c;经常受到路由器干扰&#xff0c;不能上网。本机IP应为172.16.*.*&#xff0c;被换成了192.168.*.*&#xff0c;不能连接上网认证服务器&#xff0c;及其郁闷。 开学闲暇之余&#xff0c;探索了多种方法&#xff0c;下面总结一下…

mysql行列转置-图文详解

我们想跑一个数据&#xff0c;格式如下图&#xff1a;但是我们一般的mysql语句跑出来的数据却是下面这样&#xff0c;不但不方便查看&#xff0c;在数据量比较大的时候&#xff0c;我们需要每个地区都转置粘贴一遍&#xff0c;耗时耗力还容易出错&#xff0c;下面提供一个方法&…

ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559

关于覆盖&#xff0c;用DP是一种很不错的解决方法&#xff0c;时效也很不错.... 这题目把图一画就很明确了&#xff0c;没有说明的必要了。 #include <iostream> using namespace std; __int64 height[100001]; int main () { int n; int left[100001]; int right[100001…