USB设备开发---- usb描述符概述

2023-10-27


说到USB设备,不得不提到各种描述符(descriptors), 一般来说,描述符有如下几种:

    1:设备描述符(Device Descriptors)

    2:配置描述符(Configuration Descriptors)

    2:接口描述符(Interface Descriptors)

    3:端点描述符(Endpoint Descriptors)

     一个USB设备只有一个设备描述符,设备描述符里面定义了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

详细关系如下图所示:



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

USB 复合设备上的描述符

如 USB 规范所述,每个 USB 设备都会提供一组分层描述符来定义其功能。在顶层,每个设备具有一个或多个 USB 配置描述符,其中每一个都具有一个或多个接口描述符。有关 USB 配置描述符的详细信息,请参阅 USB 配置描述符。配置是相互排斥的,因此,一次只能选择一种配置来进行操作。

在 Windows Vista 之前,Microsoft 提供的驱动程序仅选择配置 1。在 Windows Vista 和更高版本的 Windows 中,你可以设置注册表值来指定 USB 通用父驱动程序 (Usbccgp.sys) 将使用哪个配置。有关在复合设备上选择设备配置的详细信息,请参阅如何选择 USB 设备配置


https://msdn.microsoft.com/zh-cn/library/ff537071


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

开发无线键鼠有2年多了,一直对HID这东西一知半解。赶在新项目需要重新编写USB描述符部分,开始搜集资料,深入学习。

 

    枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源。一般都是使用中断传输方式通信。

    常用的描述符有以下几种:01H、设备描述符  02H、配置描述符  03H、字符串描述符  04H、接口描述符  05H、端点描述符

21H:HID描述符 22H:HID报告

    一个设备只能有一个设备描述符,而一个设备描述符可以包含多个配置描述符(bNumConfigurations  ),一个配置描述符又可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。

以下为HID描述:(一个USB设备同时包含键盘和鼠标,使用2个接口)

一、设备描述符:Device descriptor

hid_device_descriptor =
{

   0x12 ,                       // bLength   该段描述符总长18个,不可变
   0x01,                        // bDescriptorType:常用的如下0x01:设备  0x02配置 0x03字符 0x04接口 0x05端点 0x21HID
   0x0200,                    // bcdUSB  USB版本号: 1.1--0x0110   2.0--0x0200 3.0--0x0300
   0x00,                        // bDeviceClass  HID 不使用接口联合描述字与下面一起设置为00H
   0x00,                        // bDeviceSubClass
   0x00,                        // bDeviceProtocol
   8,                              // bMaxPacketSize0 端点0最大包的大小  USB2.0:低速--8  全速:8、16、32、64  高速:64
   0x1223,                    // idVendor     VID
   0x3F07,                    // idProduct     PID
   0x1110,                     // bcdDevice   厂商指定的设备版本号
   0x01,                         // iManufacturer  指向描述制造商字符串的索引
   0x02,                         // iProduct           指向描述产品的字符串索引
   0x00,                         // iSerialNumber  指向设备序列号的字符串索引
   0x01                          // bNumConfigurations  定义配置描述符的数量
};

二、配置描述符

hid_configuration_descriptor =

{
   0x09,                         // bLength  长度9个,不可变
   0x02,                         // bDescriptorType 配置描述符
   0x3b00,                     // wTotallength= 9+(9+9+7)+(9+9+7)  配置描述符+(接口描述符+HID描述符+端点描述符)*接口数
   0x02,                         // bNumInterfaces   接口数量=2(键盘+鼠标)
   0x01,                         // bConfigurationValue  Set_Configuration命令需要的参数值
   0x00,                         // iConfiguration 配置字符串索引
   0xa0,                         // bmAttributes bit7=1 bit6:1--自供电 0--总线供电bit5:1--远程唤起 0--不支持 bit[4:0]=0

   0x32                          // MaxPower (in 2mA units) 50*2mA=100mA
};

三、接口配置符

keyboard_interface_descriptor =
{  
   0x09,                               // bLength                长度9个,不可变
   0x04,                               // bDescriptorType   接口描述符
   0x00,                               // bInterfaceNumber  接口0  (接口从0开始,键盘定义0,鼠标定义1)
   0x00,                               // bAlternateSetting   接口索引值
   0x01,                               // bNumEndpoints     端点个数1(端点0不可用,比如EP1)
   0x03,                               // bInterfaceClass     (3 = HID)
   0x01,                               // bInterfaceSubClass  接口子类型:01为Boot Device,键鼠在BIOS下就启动
   0x01,                               // bInterfaceProcotol    接口协议:00--None  01--Keyboard  02--Mouse
   0x00                                // iInterface                  描述该接口的字符串索引
};

mouse_interface_descriptor =
{  
   0x09,                               // bLength   长度9个,不可变
   0x04,                               // bDescriptorType   接口描述符
   0x01,                               // bInterfaceNumber  接口1   不同接口
   0x00,                               // bAlternateSetting   接口索引值
   0x01,                               // bNumEndpoints     端点个数1(端点0不可用,比如EP2)
   0x03,                               // bInterfaceClass     (3 = HID)
   0x01,                               // bInterfaceSubClass  
接口子类型:01为Boot Device,键鼠在BIOS下就启动
   0x02,                               // bInterfaceProcotol    
接口协议:00--None  01--Keyboard  02--Mouse
   0x00                                // iInterface                  描述该接口的字符串索引
};

四、HID描述符

 keyboard_hid_descriptor =
{   
   0x09,                               // bLength                 长度9个,不可变
   0x21,                               // bDescriptorType    HID描述符
   0x0110,                           // bcdHID                   HID专属版本号
   0x00,                               // bCountryCode       国家代码
   0x01,                               // bNumDescriptors   附属类描述字的数目1个
   0x22,                               // bDescriptorType    描述字类型:报告   
   HID_KEYBOARD_REPORT_DESCRIPTOR_SIZE  // 键盘HID报告描述字总字节数,比如:0x75,0x00,低字节在前      
};

 mouse_hid_descriptor =
{   
   0x09,                               // bLength                 长度9个,不可变
   0x21,                               // bDescriptorType    HID描述符
   0x0110,                           // bcdHID                   HID专属版本号
   0x00,                               // bCountryCode       国家代码
   0x01,                               // bNumDescriptors   附属类描述字的数目1个
   0x22,                               // bDescriptorType    描述字类型:报告   
   HID_MOUSE_REPORT_DESCRIPTOR_SIZE  // 鼠标HID报告描述字总字节数,比如0x34, 0x00,低字节在前       
};

五、端点描述符

hid_keyboard_endpoint1_in_descriptor  = 
{   
   0x07,                               // bLength                   长度7个,不可变
   0x05,                               // bDescriptorType      端点描述符
   0x81,                               // bEndpointAddress   bit[7]:1--IN  0--OUT  地址为EP1,输入
   0x03,                               // bmAttributes            传输类型(中断--03H)
   0x08,                               // MaxPacketSize_LSB   端点1最大信息包尺寸
   0x00,                               // MaxPacketSize_MSB               
   0x08,                               // bInterval                   轮询间隔 一帧为8个中断间隔

};

hid_mouse_endpoint2_in_descriptor  = 
{   
   0x07,                               // bLength                   长度7个,不可变
   0x05,                               // bDescriptorType      端点描述符
   0x82,                               // bEndpointAddress   bit[7]:1--IN  0--OUT  地址为EP2,输入
   0x03,                               // bmAttributes            传输类型(中断--03H)
   0x08,                               // MaxPacketSize_LSB   端点1最大信息包尺寸
   0x00,                               // MaxPacketSize_MSB               
   0x08,                               // bInterval                   轮询间隔 一帧为8个中断间隔

};

 

主机通过标准请求命令来获得以上HID描述符和HID报告:

     标准USB设备请求命令共有11个,大小都是8个字节,具有相同的结构,由5 个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):
bmRequestType(1) +bRequest(1) +wvalue(2) +wIndex(2) +wLength(2)
一、bmRequestType:

        bit[7]: 说明请求的传输方向  1--主机到设备(OUT)   0--设备到主机(IN)

        bit[6:5]:00--标准请求命令    01--专门类请求   10--用户定义的请求    11--保留

        bit[4:0]:00000--接收者为设备   00001--接收者为接口   00010--接收者为端点  00011--接收者为其他元件 其他设置保留

二、bRequest:

      请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令):
    1、Get Status (00H)  获取状态 

       wValue:0000H    wIndex:0000H(设备)、接口号或端点号  wLength:0002H
       A:[To Device]获取设备的状态:
          位0:自供电(0表示总线供电;1表示自供电).
          位1:远程唤醒(0表示不支持远程唤醒;1表示远程唤醒).
          位2~15:保留.
          一般选择总线供电,不支持远程唤醒,所以返回数据就是0x0000.
       B:[To Interface]获取接口的状态:
          接口状态的16位字节全部保留,所以返回数据就是0x0000.
       C:[To Endpoint]获取端点的状态:
          位0:Halt(0表示端点允许;1表示端点禁止).
          位1~15:保留(复位为0).

      
    2、Clear Feature (01H) 清除特性 

      wValue:所要禁用的特征   wIndex:0000H(设备)、接口号或端点号  wLength:0000H
       A:[To Device]清除设备的远程唤醒功能,并返回一个空包.
       B:[To Endpoint]解禁端点.
   
    3、Set Feature (03H) 设置特性 

     wValue:所要使能的特征   wIndex:0000H(设备)、接口号或端点号  wLength:0000H

       A:[To Device]设置设备的远程唤醒功能,并返回一个空包.
       B:[To Endpoint]禁止端点.


    4、Set Address (05H) 设置地址 

      wValue:新的设备地址,范围0001H到007FH   wIndex:0000H  wLength:0000H
       A:设置设备地址.


    5、Get Descriptor (06H) 获取描述符 

     wValue:高字节--描述符类型  低字节--描述符索引   wIndex:0000H或ID  wLength:需返回的字节数
       A:[To Device]获取设备描述符:
          描述当前USB协议的版本号.设备端点0的FIFO大小.USB设备的ID号等.
       B:[To Configuration]获取配置描述符:
          描述USB设备接口个数及是否有自供电能力等.
       C:[To Interface]获取接口描述符:
          描述端点0以外的物理端点个数等信息.
       D:[To Endpoint]获取端点描述符:
          描述端点0各端点的传输类型和最大信息包大小和端点的传输方向(IN/OUT).


    6、Set Descriptor (07H) 设置描述符(可选,无法更新) 

    wValue:高字节--描述符类型  低字节--描述符索引   wIndex:0000H或ID  wLength:需传输给设备的字节数


    7、Get Configuration (08H) 获取配置信息 

    wValue:0000H   wIndex:0000H   wLength:0001H


    8、Set Configuration (09H) 设置配置 

    wValue:低字节规定了一个配置,若此值与设备支持的配置匹配,设备将实现所请求配置   wIndex:0000H  wLength:0000H
       A:[To Configuration]设置配置描述符.
       B:[To Interface]设置接口描述符.
       C:[To Endpoint]设置端点描述符.


    9、Get Interface (0AH) 获取接口信息    
    wValue:0000H   wIndex:接口号(bInterfaceNumber)  wLength:0001H


    10、Set Interface (0BH) 设置接口 

    wValue:要选择的替代设置(bAlternateSetting)   wIndex:接口号(bInterfaceNumber)  wLength:0000H


    11、SYNCH_FRAME(0CH)

    wValue:0000H   wIndex:0000H  wLength:0006H
        用于设备设置和报告一个端点的同步帧.

一个描述设备描述符和描述配置描述符过程如下图:

可以看到80  06  00  01  00  00  12  00主机发给设备的请求:
bmRequestType=80H说明这是主机发给设备的标准请求;
bRequest=06H说明这句的作用是Get Descriptor
wValue=0100H(注意这是小端模式,高字节在图片里显示在后)说明需要设备上传设备描述符(01)
wLength=0012H(注意这是小端模式,高字节在图片里显示在后)说明设备必须上传12H个字节长度的数据
于是设备上传了0012H长的设备描述符:12  01  00  02  00  00  00  08  23  12  07  3f  10  11  01  02  00  01
第四行80  06  00  02  00  00  09  00主机发给设备请求:
按上面的解释,说明这是主机要求设备上传配置描述符(02H),因为主机无法得知配置描述符里的wTotallength多大,所以先发个标准长度0009H来试探。
于是设备上传了09H长的配置描述符:09  02  3b  00  02  01  00  a0  32
主机得知配置总的含有003bH个字节,于是再次发给设备上传配置描述符的请求:80  06 00 02 00 00 3b  00,要求的总字节长度为003bH
之后设备上传了003bH的数据:9个配置描述符+9个接口0描述符+9个HID描述符+7个端点1描述符+9个接口1描述符+9个HID描述符+7个端点1描述符
后主机进行设置配置:00  09  01  00  00  00  00  00 设置了配置描述符,使能端点1和端点2

 

因为有2个接口,所以分2次分别设置:
EP1:读取设备描述符,试探性配置描述符,返回键盘的配置描述符长度0022H,再次以0022H长度读取配置描述符。设置配置描述符,挂起等配置完成。
配置完成后读取HID报告:81  06  00  22  00  00  b5  00
81代表主机发给设备的接口   06代表Get Descriptor   22H为HID报告  wIndex:00为接口0  长度为75H+40H=b5H(?)
设备上传接口0的0075H长度字节HID报告。
开始设置接口1,仍然继续读取设备描述符试探性配置描述符,返回键盘的配置描述符长度0022H,再次以0022H长度读取配置描述符。设置配置描述符,挂起等配置完成。
配置完成后读取HID报告:不同的是wIndex:0001H 配置接口1,长度为34H+40H=74H(?)
设备上传接口1的0034H长度字节HID报告。结束后SET REPORT,结束,等待设备上传端点键盘鼠标数据。
 
剩下的是字符串这个不是必须的还没讲到。


from: 

http://blog.csdn.net/xiliang_pan/article/details/51028712

http://lastnight1034.blog.163.com/blog/static/167118149201211710164820/

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

USB设备开发---- usb描述符概述 的相关文章

  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 软件和与外部设备串行通信的波特率限制

    我使用 USB 端口作为虚拟 COM 端口运行 以使用 MATLAB 或 Visual Basic 6 实现与外部设备的串行通信 我面临波特率限制 具体取决于我用于与设备通信的软件 MATLAB 2018a 没有问题 因为它可以设置高波特率
  • Mac中如何获取usb设备的设备描述符和配置描述符?

    I have minimum exposure to xcode and I Okit framework I have seen device descriptor and configuration descriptor of a us
  • 通过 USB 记忆棒携带和操作整个开发盒。可行的?

    最近我一直在考虑投资一个有价值的 USB 笔式驱动器 类似于 并在虚拟机上安装操作系统并开始在其上进行开发 我的想法是 我希望能够携带我的开 发箱 成为一名Windows 发行版用于 Net 开发和Linux发行版像 RoR Perl 之类
  • Android 到 PC USB 读/写

    我在 PC 上有一个程序 从 USB 接收字符串输入 旧程序 我有一个 Android 4 X 平板电脑 需要向在 PC 上运行的程序提供 USB 上的字符串输入 当我在 Android 上使用示例代码时 以下代码给出了空的哈希图 PC 在
  • USB 调试 - 安装 Epson Moverio 驱动程序时出现问题

    Android 开发新手 我使用以下命令制作了一个小应用程序Eclipse http en wikipedia org wiki Eclipse 28software 29在虚拟 Android 设备上完美运行 现在 我想在真实的设备上运行
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • 在 Python 中将 USB 视频捕获设备友好名称与 OpenCV 端口号相关联

    我想在 Windows 平台上使用 Python 获取外部 USB 视频捕获设备的友好名称和 USB 端口号 我正在使用 OpenCV 从 USB 捕获设备捕获视频 OpenCV 将 USB 端口称为 1 找到的第一个工作摄像头 0 对我来
  • 从网络浏览器中检测和访问 USB 设备 - 即使用插件

    是否可以通过插件 activeX Java 或 Flex 编写一个能够检测从 USB 设备通道读取数据流的浏览器插件 我做了一些研究 但没有找到答案 http support microsoft com kb 832678 http sup
  • Android:如何以编程方式连接/断开 OTG

    我想在我的 Android 设备中以编程方式连接和断开 USB OTG 笔式驱动器 硬盘驱动器等 对于USB 我使用以下路径在连接到PC时绑定 取消绑定USB sys bus usb drivers usb bind or unbind 我
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 如何将 Android USB 连接模式更改为仅充电? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • Android 3.1 USB 主机 - BroadcastReceiver 未收到 USB_DEVICE_ATTACHED

    我经历过USB 主机的描述和示例位于developer android com http developer android com guide topics usb host html检测连接和分离的 USB 设备 如果我在清单文件中使用
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • Python:获取USB闪存驱动器设备的名称[windows]

    我正在尝试编写一个小程序 它将能够读取有关 REMOVEABLE DEVICE USB 的一些信息 我试过了pyusb https github com walac pyusb但我无法提取我需要的数据 我想从系统中读取 USB 设备的名称
  • 当前有哪些 USB 设备(友好名称)连接到 PC?

    我可以获得当前连接到计算机的设备列表吗 我检查了this https stackoverflow com q 3331043 75500 and this https stackoverflow com questions 3685615
  • 通过 USB 将原始文本发送到打印机

    我正在尝试将 ZPL 命令发送到 Zebra ZT230 打印机 打印机和驱动程序已安装 打印机端口为 USB003 PC 通过 Zebra 打印机设置实用程序或 ZebraDesign 与打印机完美通信 我尝试了以下代码 Private
  • 在 Windows 中以编程方式重新启动 USB 设备

    我正在开发的一些软件需要 USB 设备 我作为串行端口与 USB 转 UART 桥进行交互 有时 计算机从休眠状态重新启动后 无法检测到该设备 并且我无法再通过串行端口写入或读取该设备 需要对设备进行读 写访问 我不能依赖用户采取任何操作

随机推荐

  • 什么是数据湖 Data Lake

    什么是数据湖 Data Lake 背景 随着近几年机器学习的兴起对数据的需求更加灵活 如果从数据仓库中提数会有一些问题 比如 数据都是结构化的 做算法的经常要理解数仓模型 甚至要深入到做了什么业务处理 很多处理都不是他们想要的 数据是经过处
  • 转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

    转载自 https blog csdn net yinhun2012 article details 84236202 这一篇是为了后面着色效果的数学基础做积累 之前我们使用矩阵的大部分情况都是直接的仿射空间变换 就是仿射空间A变换到仿射空
  • Android:ARouter原理源码解析

    文章目录 前言 一 ARouter使用 二 ARouter初始化 init 函数 整体 LogisticsCenter初始化 拦截器初始化 三 跳转解析 跳转 总结 前言 一 ARouter使用 ARouter的基本使用请参考这篇博客 AR
  • 分治03--二叉搜索树和双向链表

    分治03 二叉搜索树和双向链表 jz26 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 输入一棵二叉搜索树 将该二叉搜索树转换成一个排序的双向链表 要求不能创建任何新的结点 只能调整树中结点指针的指向 测试用例 输入 10
  • Thinkcmf 后台弹框页面代码

    thinkcmf是基于layer做的弹出层 https www layui com doc modules layer html 可以看layer的文档学习 选择信息 列表展示 html页面
  • Failed to remove the service because the service is running Stop the service and try again解决方法

    解决方法 Failed to remove the service because the service is running Stop the service and try again mysqld remove 报错 在Window
  • 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1 微信配置信息 global properties 2 方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调 注意 在手机端使用微信支付成功后 微信服务器会根据提供的回调地址进行回调 param
  • JavaWeb笔记:第07章 MVC

    JavaWeb笔记 第07章 MVC EL JST Filter Listener JQuery AJAX Maven JSON Redis Linux Nginx 1 MVC 开发模式 2 EL表达式 2 1 概念 作用 语法 2 2 E
  • Springboot初识--Bean的理解

    注解下的Spring Ioc Spring所提供的两个核心理念 一个是控制反转 Inversion of Control IoC 另一个是面向切面编程 Aspect Oriented Progarmming AOP IoC容器是spring
  • Mybatis中parameterType的用法

    在mybatis映射接口的配置中 有select insert update delete等元素都提到了parameterType的用法 parameterType为输入参数 在配置的时候 配置相应的输入参数类型即可 parameterTy
  • rsync安装及使用详细步骤

    目录 1 介绍rsync 2 rsync的安装以及操作方法 3 启动rsync 4 文件传输 5 效验 6 总结 rsync 是一个开源的命令行工具 用于在不同的主机之间同步文件和目录 它可以通过远程 shell 或 rsync 协议 默认
  • SQL语句学习系列(1)

    目录 查询语句 1 查询所有列的所有行 2 查询指定列的所有行 3 查询满足条件的行 4 查询满足多个条件的行 6 查询满足条件的行数 7 查询满足条件的唯一值 8 查询满足条件的分组统计 9 查询满足条件的平均值 10 查询满足条件的最大
  • C语言练习题(14) 有以下函数,该函数的功能是( )int fun(char *s) { char *t = s; while(*t++); return(t-s); }(非常详细的讲解)

    1 有以下函数 该函数的功能是 int fun char s char t s while t return t s A 比较两个字符的大小 B 计算s所指字符串占用内存字节的个数 C 计算s所指字符串的长度 D 将s所指字符串复制到字符串
  • 深入研究源码:Android10.0系统启动流程(三):Zygote

    前言 研究过程中参考了很多的文章 这篇源码分析 可能是全网最全的Zygote源码分析了 如果觉得这篇源码分析太干 也可以先看一下后续的相关总结 戳https juejin im post 6844903966665539591 全文概览 我
  • java项目的心得,java项目的代码层次的架构划分

    java项目使用的架构是ssm Spring SpringMVC MyBatis 一 后台代码一般分三层 Controller Service Dao 1 Controller层是对前端或者接口的响应一个逻辑处理的层 这个层级一般调用的是S
  • 3、MyBatisPlus的CRUD 接口

    MyBatisPlus的CRUD 接口 一 insert 1 插入操作 2 主键策略 二 update 1 根据Id更新操作 2 自动填充 3 乐观锁 三 select 1 根据id查询记录 2 通过多个id批量查询 3 简单的条件查询 4
  • Nor flash 页写地址与数据大小的限制

    厂商提供的flash手册如下 如果页写指令的地址不是256的整数倍 并且写入的数据量超过了当前地址所在页的边界 则超过的那些数据会重新写入当前页的首地址 即256的整数倍地址 所以 在进行页写的时候 要注意这个限制 跨页写数据时注意分多个页
  • JAVA验证数字的整数位长度及小数据位长度

    文章目录 一 案例说明 二 使用步骤 1 引入库 2 读入数据 一 案例说明 验证数字的整数位长度及小数据位长度 二 使用步骤 1 引入库 代码如下 示例 import java util regex Matcher import java
  • 9、无须光照的模型假阴影实现 URP

    模型阴影 我们在实际项目中 经常会有模型影子的需求 这个时候如果使用光照的话 在移动端性能消耗太大 如果使用一个假的阴影片 效果又不太好 我们希望有能够有和灯光系统一样的阴影效果 我们通过模拟灯光的方式来实现 之前我们写的shader都是对
  • USB设备开发---- usb描述符概述

    说到USB设备 不得不提到各种描述符 descriptors 一般来说 描述符有如下几种 1 设备描述符 Device Descriptors 2 配置描述符 Configuration Descriptors 2 接口描述符 Interf