4. 中断传输核心原理:端点描述符、轮询间隔与数据包大小的硬件约束
中断传输(Interrupt Transfer)是 USB 协议中唯一具有确定性延迟保证的传输类型,但其行为并非由软件调度决定,而是由端点描述符中的三个硬件字段严格约束:bInterval(轮询间隔)、wMaxPacketSize(最大数据包大小)以及端点类型编码。本章深入解析这些字段的硬件含义、约束条件及其对实时通信的影响。
核心观点:中断传输的实时性来源于主机控制器对中断端点的固定周期轮询,而非设备主动发起中断。轮询周期、数据包大小和端点数量共同决定了中断传输的带宽上限与延迟下界。
4.1 中断端点描述符结构
中断端点通过标准端点描述符(Standard Endpoint Descriptor)定义,其结构在 USB 规范中固定为 7 字节。关键字段如下:
| 偏移量 | 字段名 | 大小(字节) | 说明 |
|---|---|---|---|
| 0 | bLength | 1 | 描述符长度,固定为 0x07 |
| 1 | bDescriptorType | 1 | 端点描述符类型,固定为 0x05 |
| 2 | bEndpointAddress | 1 | 端点方向(bit7)和端点号(bit3-0) |
| 3 | bmAttributes | 1 | 传输类型:bit1-0 = 0x03 表示中断传输 |
| 4-5 | wMaxPacketSize | 2 | 每次事务的最大数据载荷(字节) |
| 6 | bInterval | 1 | 轮询间隔(单位:帧/微帧) |
Linux 内核对应结构体:在
include/uapi/linux/usb/ch9.h 中定义为 struct usb_endpoint_descriptor,其中 wMaxPacketSize 和 bInterval 是中断传输实时性分析的核心字段。
4.2 轮询间隔(bInterval)的硬件约束
bInterval 字段定义了主机控制器(Host Controller, HC)对中断端点的轮询周期。其编码方式因 USB 总线速度而异,这是中断传输实时性的第一道硬件约束。
4.2.1 不同速度下的 bInterval 编码规则
| USB 速度 | bInterval 单位 | 有效范围 | 实际轮询周期 | 最小延迟 |
|---|---|---|---|---|
| Low-Speed (1.5 Mbps) | 帧(1 ms) | 10 – 255 | bInterval × 1 ms | 10 ms |
| Full-Speed (12 Mbps) | 帧(1 ms) | 1 – 255 | bInterval × 1 ms | 1 ms |
| High-Speed (480 Mbps) | 微帧(125 µs) | 1 – 16 | 2^(bInterval-1) × 125 µs | 125 µs |
| SuperSpeed (5 Gbps) | 微帧(125 µs) | 1 – 16 | 2^(bInterval-1) × 125 µs | 125 µs |
常见误区:High-Speed 下 bInterval 并非线性值,而是指数编码。例如 bInterval=4 表示轮询周期为 2^(4-1) × 125 µs = 1 ms,而非 4 × 125 µs = 500 µs。这一编码规则是为了在有限的 8 位字段中覆盖从 125 µs 到 4.096 s 的宽范围。
4.2.2 轮询间隔对实时性的影响
中断传输的最大延迟由轮询间隔决定:设备在两次轮询之间产生的数据,必须等待下一次主机轮询才能被读取。因此:
- 理论最小延迟 = 1 个轮询周期(理想情况下,数据刚好在轮询前准备好)
- 理论最大延迟 = 2 个轮询周期(数据在轮询刚结束后产生)
- 实际延迟 = 轮询周期 + 总线竞争 + 中断处理开销
对于实时通信系统,通常要求中断传输的轮询周期 ≤ 应用层采样周期的 1/2,以满足 Nyquist 准则。
4.3 数据包大小(wMaxPacketSize)的硬件约束
wMaxPacketSize 定义了每次中断事务中单次传输的最大数据载荷。该值受 USB 总线速度和端点类型的双重限制,是中断传输的第二道硬件约束。
4.3.1 不同速度下的 wMaxPacketSize 上限
| USB 速度 | 中断端点 wMaxPacketSize 上限 | 备注 |
|---|---|---|
| Low-Speed | 8 字节 | 仅支持控制传输和中断传输 |
| Full-Speed | 64 字节 | 中断端点最大 64 字节 |
| High-Speed | 1024 字节(3 个微帧事务) | 允许突发模式(bust mode) |
| SuperSpeed | 1024 字节 | 支持批量流(Bulk Streams) |
4.3.2 wMaxPacketSize 的位域结构
在 High-Speed 模式下,wMaxPacketSize 的低 11 位表示数据包大小,高 5 位用于描述额外事务数(Transactions per Microframe, TPM):
// wMaxPacketSize 位域定义(High-Speed 中断端点)
// bit 10:0 — 数据包大小(0-1023)
// bit 12:11 — 额外事务数(0-2,表示 1-3 个事务/微帧)
// bit 15:13 — 保留
// 示例:wMaxPacketSize = 0x0400
// 数据包大小 = 1024 字节
// 额外事务数 = 0 → 每个微帧 1 个事务
实时通信含义:High-Speed 中断端点通过突发模式,可以在一个微帧内传输最多 3 × 1024 = 3072 字节,但这也意味着该端点占用了微帧中更多的总线时间,可能影响其他中断端点的延迟。
4.4 中断传输的带宽预算与调度约束
中断传输的带宽并非无限制。主机控制器在枚举阶段会计算所有中断端点的总带宽需求,并拒绝超出总线容量的配置。带宽计算公式如下:
// 中断端点带宽需求(字节/秒)
// Full-Speed:
bandwidth = wMaxPacketSize × (1000 / bInterval)
// High-Speed:
bandwidth = wMaxPacketSize × (1 + extra_transactions) × (8000 / (2^(bInterval-1)))
// 示例:High-Speed 中断端点
// wMaxPacketSize = 512, bInterval = 3 (周期 = 2^(3-1) × 125 µs = 500 µs)
// bandwidth = 512 × 1 × (8000 / 4) = 512 × 2000 = 1,024,000 字节/秒 ≈ 1 MB/s
4.5 中断传输端点描述符与实时约束关系图
下图展示了中断端点描述符中 bInterval 和 wMaxPacketSize 如何共同决定中断传输的实时性能边界:
4.6 中断传输的硬件约束总结
中断传输的实时性能受以下硬件约束的乘积效应影响:
- 轮询间隔(bInterval):决定中断延迟的下界,High-Speed 下最小可达 125 µs,但受指数编码限制,实际可用周期为 125 µs × 2^(n-1)。
- 数据包大小(wMaxPacketSize):决定单次中断事务的吞吐量上限,High-Speed 下最大 1024 字节,支持突发模式。
- 带宽预算:所有中断端点的总带宽需求不能超过总线容量的 90%(Full-Speed)或 80%(High-Speed),否则枚举失败。
- 端点数量:每个微帧/帧内可服务的中断端点数量受限于主机控制器的调度能力(通常为 8-16 个)。
实践建议:在实时通信系统中,应优先选择 High-Speed 中断端点,设置 bInterval=1(125 µs 轮询周期),wMaxPacketSize 根据实际数据量选择最小值以节省带宽。对于周期性传感器数据,通常 8-64 字节即可满足需求。