USB组合设备——带鼠标功能的键盘
文章目录
- 带鼠标功能的键盘
- 一个接口实现
- 报告描述符示例
- 多个接口实现
- 复合设备和组合设备
- 配置描述符集合的实现
- 报告的返回
- 附 STM32 枚举日志
- 复合设备:Compound Device 内嵌 Hub 和多个 Function,每个 Function 都相当于一个独立的 USB 外设,有自己的 PID/VID/DID。
- 组合设备:Composite Device 内只有一个 Function,只有一套 PID/VID/DID。
这里使用组合设备来实现
带鼠标功能的键盘
要实现带鼠标功能的键盘有两种方式
- 一个接口,但是使用两个应用集合和两个报告
- 两个接口,分别实现键盘和鼠标
一个接口实现
设备描述符,配置描述符,HID 描述符 (注意报告描述符的长度) 和端点描述符等保持不变,唯一不同的是报告描述符和报告描述符的长度。
报告描述符示例
端点 0 最大包长为 64,分包传输如下
0x5 0x1 0x9 0x6 0xa1 0x1 0x85 0x1 0x5 0x7 0x19 0xe0 0x29 0xe7 0x15 0x0 0x25 0x1 0x95 0x8 0x75 0x1 0x81 0x2 0x95 0x1 0x75 0x8 0x81 0x1 0x5 0x8 0x19 0x1 0x29 0x5 0x95 0x5 0x75 0x1 0x91 0x2 0x95 0x1 0x75 0x3 0x91 0x1 0x5 0x7 0x19 0x0 0x2a 0xff 0x0 0x15 0x0 0x26 0xff 0x0 0x95 0x6 0x75 0x8
0x81 0x0 0xc0 0x5 0x1 0x9 0x2 0xa1 0x1 0x85 0x2 0x9 0x1 0xa1 0x0 0x5 0x9 0x19 0x1 0x29 0x5 0x15 0x0 0x25 0x1 0x95 0x5 0x75 0x1 0x81 0x2 0x95 0x1 0x75 0x3 0x81 0x1 0x5 0x1 0x9 0x30 0x9 0x31 0x15 0x81 0x25 0x7f 0x95 0x2 0x75 0x8 0x81 0x6 0x9 0x38 0x15 0x81 0x25 0x7f 0x95 0x1 0x75 0x8 0x81
:0x6 0x5 0xc 0xa 0x38 0x2 0x15 0x81 0x25 0x7f 0x95 0x1 0x75 0x8 0x81 0x6 0xc0 0xc0 0x5 0xc 0x9 0x1 0xa1 0x1 0x85 0x3 0x15 0x0 0x26 0xff 0x3 0x19 0x0 0x2a 0xff 0x3 0x95 0x1 0x75 0x10 0x81 0x0 0xc0 0x5 0x1 0x9 0x5 0xa1 0x1 0x85 0x4 0x5 0x1 0x9 0x30 0x9 0x31 0x9 0x32 0x9 0x35 0x9 0x33 0x9
0x34 0x15 0x81 0x25 0x7f 0x95 0x6 0x75 0x8 0x81 0x2 0x5 0x1 0x9 0x39 0x15 0x1 0x25 0x8 0x35 0x0 0x46 0x3b 0x1 0x95 0x1 0x75 0x8 0x81 0x2 0x5 0x9 0x19 0x1 0x29 0x20 0x15 0x0 0x25 0x1 0x95 0x20 0x75 0x1 0x81 0x2 0xc0
上述报告描述符设置了四个报告
- KEYBOARD:ID 为 1
- MOUSE:ID 为 2
- CONSUMER_CONTROL:ID 为 3
- GAMEPAD:ID 为 4
报告返回时,报告的最低为 a 指定报告 ID 即可
例如键盘报告的返回, 最低为 1
0x1 0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
- 0x01 表示键盘的报告
- 0x04 表示
a
按下
鼠标报告的返回最低为为 2
0x2 0x0 0x5 0x5 0x0 0x0
- 0x02 表示鼠标的报告
- 0x05 表示 x 轴移动量
- 0x05 表示 y 轴移动量
其他报告的返回类似。
多个接口实现
复合设备和组合设备
USB - 描述符之间的关系 中可以知道,多个接口实现时,一个接口实现鼠标,一个接口实现键盘,所以此时的配置描述符集合为
{配置描述符,接口 1 描述符接口描述符 (键盘接口),类特殊描述符 (HID 描述符 - 键盘),端点描述符 (键盘输入端点),接口 2 描述符接口描述符 (鼠标接口),类特殊描述符 (HID 描述符 - 鼠标),端点描述符 (鼠标输入端点),
}
配置描述符集合的实现
0x9 0x2 0x3b 0x0 0x2 0x1 0x0 0xa0 0x32 0x9 0x4 0x0 0x0 0x1 0x3 0x1 0x1 0x4 0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x41 0x0 0x7 0x5 0x81 0x3 0x8 0x0 0xa 0x9 0x4 0x1 0x0 0x1 0x3 0x1 0x2 0x5 0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x4d 0x0 0x7 0x5 0x82 0x3 0x8 0x0 0xa
- 配置描述符 (0x9 0x2 0x3b 0x0 0x2 0x1 0x0 0xa0 0x32)
- 键盘接口描述符
- 接口描述符 (0x9 0x4 0x0 0x0 0x1 0x3 0x1 0x1 0x4)
- 类特殊描述符 (HID 描述符:0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x41 0x0)
- 端点描述符 (0x7 0x5 0x81 0x3 0x8 0x0 0xa)
- 鼠标接口描述符
- 接口描述符 (0x9 0x4 0x1 0x0 0x1 0x3 0x1 0x2 0x5)
- 类特殊描述符 (HID 描述符:0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x4d 0x0)
- 端点描述符 (0x7 0x5 0x82 0x3 0x8 0x0 0xa)
配置描述符的 bNumInterfaces(第五个数据) 的值为 2,表明有两个接口
接口描述符的 bInterfaceNumber(第三个数据) 表示接口的编号,从 0 开始。
接口描述符的 iInterface(最后一个数据) 表示接口字符串的索引,主机在获取字符串描述符时,需要根据索引返回相应的字符串。
报告的返回
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
0x0 0x5 0x5 0x0 0x0
往对应的端点写数据即可。
附 STM32 枚举日志
suspend int
bus reset int
enum done int
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x1 0x0 0x0 0x40 0x0
dcd xfer 12
input ep int
d->h :0x12 0x1 0x0 0x2 0x0 0x0 0x0 0x40 0xfe 0xca 0x8 0x40 0x0 0x1 0x1 0x2 0x3 0x1
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:bus reset int
output ep int
send xfer complete event
enum done int
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x0 0x5 0x5 0x0 0x0 0x0 0x0 0x0
dcd xfer 0
input ep int
edpt int send xfer complete event
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x1 0x0 0x0 0x12 0x0
dcd xfer 12
input ep int
d->h :0x12 0x1 0x0 0x2 0x0 0x0 0x0 0x40 0xfe 0xca 0x8 0x40 0x0 0x1 0x1 0x2 0x3 0x1
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:output ep int
send xfer complete event
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x2 0x0 0x0 0xff 0x0
dcd xfer 3b
input ep int
d->h :0x9 0x2 0x3b 0x0 0x2 0x1 0x0 0xa0 0x32 0x9 0x4 0x0 0x0 0x1 0x3 0x1 0x1 0x4 0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x41 0x0 0x7 0x5 0x81 0x3 0x8 0x0 0xa 0x9 0x4 0x1 0x0 0x1 0x3 0x1 0x2 0x5 0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x4d 0x0 0x7 0x5 0x82 0x3 0x8 0x0 0xa
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x3 0x3 0x9 0x4 0xff 0x0
send xfer complete event
dcd xfer e
input ep int
d->h :0xe 0x3 0x31 0x0 0x32 0x0 0x33 0x0 0x34 0x0 0x35 0x0 0x36 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x3 0x0 0x0 0xff 0x0
send xfer complete event
dcd xfer 4
input ep int
d->h :0x4 0x3 0x9 0x4
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x2 0x3 0x9 0x4 0xff 0x0
send xfer complete event
dcd xfer 1e
input ep int
d->h :0x1e 0x3 0x54 0x0 0x69 0x0 0x6e 0x0 0x79 0x0 0x55 0x0 0x53 0x0 0x42 0x0 0x20 0x0 0x44 0x0 0x65 0x0 0x76 0x0 0x69 0x0 0x63 0x0 0x65 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x6 0x0 0x0 0xa 0x0
send xfer complete event
get device qualifier
stall ep0
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x1 0x0 0x0 0x12 0x0
dcd xfer 12
input ep int
d->h :0x12 0x1 0x0 0x2 0x0 0x0 0x0 0x40 0xfe 0xca 0x8 0x40 0x0 0x1 0x1 0x2 0x3 0x1
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x2 0x0 0x0 0x9 0x0
send xfer complete event
dcd xfer 9
input ep int
d->h :0x9 0x2 0x3b 0x0 0x2 0x1 0x0 0xa0 0x32
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x2 0x0 0x0 0x3b 0x0
send xfer complete event
dcd xfer 3b
input ep int
d->h :0x9 0x2 0x3b 0x0 0x2 0x1 0x0 0xa0 0x32 0x9 0x4 0x0 0x0 0x1 0x3 0x1 0x1 0x4 0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x41 0x0 0x7 0x5 0x81 0x3 0x8 0x0 0xa 0x9 0x4 0x1 0x0 0x1 0x3 0x1 0x2 0x5 0x9 0x21 0x11 0x1 0x0 0x1 0x22 0x4d 0x0 0x7 0x5 0x82 0x3 0x8 0x0 0xa
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x0 0x9 0x1 0x0 0x0 0x0 0x0 0x0
send xfer complete event
edpt open
edpt open
dcd xfer 0
input ep int
edpt int send xfer complete event
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x4 0x3 0x9 0x4 0x4 0x0
dcd xfer 4
input ep int
d->h :0x26 0x3 0x4b 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x3 0x0 0x0 0xff 0x0
send xfer complete event
dcd xfer 4
input ep int
d->h :0x4 0x3 0x9 0x4
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x4 0x3 0x9 0x4 0x26 0x0
send xfer complete event
dcd xfer 26
input ep int
d->h :0x26 0x3 0x4b 0x0 0x65 0x0 0x79 0x0 0x62 0x0 0x6f 0x0 0x61 0x0 0x72 0x0 0x64 0x0 0x20 0x0 0x49 0x0 0x6e 0x0 0x74 0x0 0x65 0x0 0x72 0x0 0x66 0x0 0x61 0x0 0x63 0x0 0x65 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x0 0x3 0x0 0x0 0xff 0x0
send xfer complete event
dcd xfer 4
input ep int
d->h :0x4 0x3 0x9 0x4
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x5 0x3 0x9 0x4 0x4 0x0
send xfer complete event
dcd xfer 4
input ep int
d->h :0x20 0x3 0x4d 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x1 0x3 0x9 0x4 0xff 0x0
send xfer complete event
dcd xfer 10
input ep int
d->h :0x10 0x3 0x54 0x0 0x69 0x0 0x6e 0x0 0x79 0x0 0x55 0x0 0x53 0x0 0x42 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x5 0x3 0x9 0x4 0x20 0x0
send xfer complete event
dcd xfer 20
input ep int
d->h :0x20 0x3 0x4d 0x0 0x6f 0x0 0x75 0x0 0x73 0x0 0x65 0x0 0x20 0x0 0x49 0x0 0x6e 0x0 0x74 0x0 0x65 0x0 0x72 0x0 0x66 0x0 0x61 0x0 0x63 0x0 0x65 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x1 0x3 0x9 0x4 0xff 0x0
send xfer complete event
dcd xfer 10
input ep int
d->h :0x10 0x3 0x54 0x0 0x69 0x0 0x6e 0x0 0x79 0x0 0x55 0x0 0x53 0x0 0x42 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x21 0xa 0x0 0x0 0x0 0x0 0x0 0x0
send xfer complete event
dcd xfer 0
input ep int
edpt int send xfer complete event
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x2 0x3 0x9 0x4 0xff 0x0
dcd xfer 1e
input ep int
d->h :0x1e 0x3 0x54 0x0 0x69 0x0 0x6e 0x0 0x79 0x0 0x55 0x0 0x53 0x0 0x42 0x0 0x20 0x0 0x44 0x0 0x65 0x0 0x76 0x0 0x69 0x0 0x63 0x0 0x65 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x81 0x6 0x0 0x22 0x0 0x0 0x81 0x0
send xfer complete event
dcd xfer 40
input ep int
d->h :0x5 0x1 0x9 0x6 0xa1 0x1 0x5 0x7 0x19 0xe0 0x29 0xe7 0x15 0x0 0x25 0x1 0x95 0x8 0x75 0x1 0x81 0x2 0x95 0x1 0x75 0x8 0x81 0x1 0x5 0x8 0x19 0x1 0x29 0x5 0x95 0x5 0x75 0x1 0x91 0x2 0x95 0x1 0x75 0x3 0x91 0x1 0x5 0x7 0x19 0x0 0x2a 0xff 0x0 0x15 0x0 0x26 0xff 0x0 0x95 0x6 0x75 0x8 0x81 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 1
input ep int
d->h :0xc0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x80 0x6 0x2 0x3 0x9 0x4 0xff 0x0
send xfer complete event
dcd xfer 1e
input ep int
d->h :0x1e 0x3 0x54 0x0 0x69 0x0 0x6e 0x0 0x79 0x0 0x55 0x0 0x53 0x0 0x42 0x0 0x20 0x0 0x44 0x0 0x65 0x0 0x76 0x0 0x69 0x0 0x63 0x0 0x65 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:setup packed recvd
setup packed done
output ep int
h->d: 0x21 0xa 0x0 0x0 0x1 0x0 0x0 0x0
send xfer complete event
dcd xfer 0
input ep int
edpt int send xfer complete event
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x81 0x6 0x0 0x22 0x1 0x0 0x8d 0x0
dcd xfer 40
input ep int
d->h :0x5 0x1 0x9 0x2 0xa1 0x1 0x9 0x1 0xa1 0x0 0x5 0x9 0x19 0x1 0x29 0x5 0x15 0x0 0x25 0x1 0x95 0x5 0x75 0x1 0x81 0x2 0x95 0x1 0x75 0x3 0x81 0x1 0x5 0x1 0x9 0x30 0x9 0x31 0x15 0x81 0x25 0x7f 0x95 0x2 0x75 0x8 0x81 0x6 0x9 0x38 0x15 0x81 0x25 0x7f 0x95 0x1 0x75 0x8 0x81 0x6 0x5 0xc 0xa 0x38
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer d
input ep int
d->h :0x2 0x15 0x81 0x25 0x7f 0x95 0x1 0x75 0x8 0x81 0x6 0xc0 0xc0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 0
rxflvl int
ep 0 out packet recvd:output ep int
send xfer complete event
rxflvl int
setup packed recvd
setup packed done
output ep int
h->d: 0x21 0x9 0x0 0x2 0x0 0x0 0x1 0x0
dcd xfer 1
rxflvl int
ep 0 out packet recvd:
buffer: 0x15
output ep int
send xfer complete event
dcd xfer 0
input ep int
edpt int send xfer complete event
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 5
0x0 0x5 0x5 0x0 0x0
input ep int
d->h :0x0 0x5 0x5 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 5
0x0 0x5 0x5 0x0 0x0
input ep int
d->h :0x0 0x5 0x5 0x0 0x0
turn off txfe
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
dcd xfer 5
0x0 0x5 0x5 0x0 0x0
input ep int
d->h :0x0 0x5 0x5 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
dcd xfer 5
0x0 0x5 0x5 0x0 0x0
input ep int
d->h :0x0 0x5 0x5 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 5
0x0 0x5 0x5 0x0 0x0
input ep int
d->h :0x0 0x5 0x5 0x0 0x0
turn off txfe
dcd xfer 8
0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x4 0x0 0x0 0x0 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
dcd xfer 8
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
input ep int
d->h :0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
turn off txfe
input ep int
edpt int send xfer complete event
相关文章:
USB组合设备——带鼠标功能的键盘
文章目录带鼠标功能的键盘一个接口实现报告描述符示例多个接口实现复合设备和组合设备配置描述符集合的实现报告的返回附 STM32 枚举日志复合设备:Compound Device 内嵌 Hub 和多个 Function,每个 Function 都相当于一个独立的 USB 外设,有自…...

数据结构与算法基础-学习-18-哈夫曼编码
一、个人理解在远程通讯中,需要把字符转成二进制的字符串进行传输,例如我们需要传输ABCD,我们可以用定长的字符串进行表示,例如:A:00B:01C:02D:03这样可能就造成空间的浪费,我们多存储了一个0号位。那用变长呢…...

ZMC408CE | 实现“8通道独立PSO”应用场景
一、ZMC408SCAN产品亮点 1.高性能处理器,提升运算速度、响应时间和扫描周期等; 2.一维/二维/三维、多通道视觉飞拍,高速高精; 3.位置同步输出PSO,连续轨迹加工中对精密点胶胶量控制和激光能量控制等; 4…...
QuickJS中JS_SetClassProto方法把JavaScript对象指定为某个类的原型对象
在 QuickJS 中,JS_SetClassProto 方法用于设置一个类的原型对象。这个方法的作用是将一个 JavaScript 对象指定为该类的原型对象,从而定义该类的属性和方法。 具体来说,JS_SetClassProto 方法的第一个参数是指向 QuickJS 引擎执行上下文的指…...

泰克信号发生器特点
泰克信号发生器是一种用于产生各种类型的电子信号的仪器,可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点:多种信号类型:泰克信号发生器可以产生多种类型的电子信号,包括正弦波、方波、三角波、脉冲等…...

贯穿设计模式第四话--里氏替换原则
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…...
6501: 鸡兔同笼
描述 一个笼子里面关了鸡和免子(鸡有两只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 输入 一个正整数a(a<32768)。 输出 包含两个正整数,第一个是最少的动物数,第二个是最多的…...

Linux项目自动化构建工具-make/makefile 介绍及使用
使用背景 在工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义一系列 规则来指定什么文件需要先编译,什么文件需要后编译,哪些文件需要重新编译,或者更复杂 的功能操作 makefile带来的好处…...

【云原生|Docker】06-dokcerfile详解
目录 前言 Dockerfile基础示例 Dockerfile简介 1. Dockerfile概念 2. Dokcer镜像分层理解 3. Doker build构建原理 Dockerfile参数解析 1. Dokcerfile组成 2. 指令说明 2.1 FROM引入基础镜像 2.2 LABEL 2.3 ENV 2.4 RUN 2.5 COPY 2.6 ADD 2…...

【SCL】博图——先入先出排序法
使用博图SCL语言来实现先入先出排序 前言 使用SCL完成一个先入先出排序 具体要求:最先输入的一个数值,最先输出出来,下面的数自动向前填充; 注:这里可能有两种理解:一是第一个输入的第一个出来ÿ…...

OSPF----特殊区域
目录 OSPF----特殊区域 第一大类----末梢区域(Stub Area) 完全末梢区域((Totally Stub Area) 第二大类特殊区域----非完全末梢区域(NSSA) OSPF----特殊区域 第一大类----末梢区域(Stub Area)…...

JVM-类加载
1:类加载机制: 加、验、准、解、初、使、卸 加、烟、准、姐、初、湿、鞋 加载、将class 文件转化为二进制流加载 JVM 内存中并生成一个该类的Class对象验证、Class 文件的字节流中包含的信息是否符合当前虚拟机的要求准备、在方法区中分配这些变量所…...

超详细讲解C语言文件操作!!
超详细讲解C语言文件操作!!什么是文件文件名文件的打开和关闭文件指针文件的打开和关闭文件的顺序读写文件的随机读写fseekftellrewind文本文件和二进制文件文件读取结束的判定文件缓冲区什么是文件 磁盘上的文件是文件。但是在程序设计中,我…...

linxu学习之进程
文章目录进程程序和进程产生进程销毁进程多进程高并发设计孤儿僵尸守护进程孤儿进程:守护进程(重点)僵尸进程:进程 程序和进程 操作系统可以运行多个程序,那他是如何运行的?实际上,CPU的执行是很快的,而待…...
蓝桥杯真题2
[蓝桥杯 2013 省 B] 连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在 111 ~ NNN 的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间 [L,R][L, R][L,R] 里的所有元素(即此排列的…...

PWM互补输出,以及死区时间计算
本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波,且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码: bsp_advance_tim.c /********************************************************************************* fi…...

基于深度学习的海洋动物检测系统(Python+YOLOv5+清新界面)
摘要:基于深度学习的海洋动物检测系统使用深度学习技术检测常见海洋动物,识别图片、视频和实时视频中的海洋动物,方便记录、展示和保存结果。本文详细介绍海洋动物检测系统,在介绍算法原理的同时,给出Python的实现代码…...
C# 计算方差
50,100,100,60,50 计算他们的方差 为了计算这些数的方差,需要进行以下步骤: 1. 计算平均值,即将这些数相加,然后除以它们的数量。 平均值 (50 100 100 60 50) / 5 72 2. 计…...

HJZS电源监视继电器HJZS-E202 AC220V
系列型号: HJZS-E202断电延时继电器 HJZS-E002断电延时继电器 一 应用 HJZS-E202电源监视继电器用于直流或交流操作的各种保护和自动控制的装置中,用以增加触点数量。 二 安装结构 导轨安装9壳体结构,具体尺寸参阅外型尺寸图。 三 产品型号…...

dolphinscheduler 2.0.6 资源中心改造方案二:通过NFS挂载共享目录
目录调度资源中心存储概要安装NFS服务器客户端调度验证关闭SFTP开关(可忽略)重新上传资源文件worker执行任务验证服务器woker客户端worker其它nfs共享目录的配置文件/etc/exports说明调度资源中心存储概要 针对现有的单机存储可以做哪些扩展?…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...