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 如何共同决定中断传输的实时性能边界:

中断传输实时约束关系图 端点描述符 bmAttributes = 0x03 bInterval wMaxPacketSize 速度相关编码规则 FS: 线性 (1-255 ms) HS: 指数 (2^(bInterval-1) × 125µs) 速度相关大小上限 FS: ≤64B | HS: ≤1024B HS 支持突发模式 (×3) 轮询周期 决定中断延迟下界 单次数据载荷 决定吞吐量上限 带宽预算 = wMaxPacketSize × (1 + extra_tx) × 轮询频率 主机控制器在枚举时校验,超出总线容量则拒绝配置 实时系统约束 轮询周期 ≤ 采样周期/2

4.6 中断传输的硬件约束总结

中断传输的实时性能受以下硬件约束的乘积效应影响:

  1. 轮询间隔(bInterval):决定中断延迟的下界,High-Speed 下最小可达 125 µs,但受指数编码限制,实际可用周期为 125 µs × 2^(n-1)。
  2. 数据包大小(wMaxPacketSize):决定单次中断事务的吞吐量上限,High-Speed 下最大 1024 字节,支持突发模式。
  3. 带宽预算:所有中断端点的总带宽需求不能超过总线容量的 90%(Full-Speed)或 80%(High-Speed),否则枚举失败。
  4. 端点数量:每个微帧/帧内可服务的中断端点数量受限于主机控制器的调度能力(通常为 8-16 个)。
实践建议:在实时通信系统中,应优先选择 High-Speed 中断端点,设置 bInterval=1(125 µs 轮询周期),wMaxPacketSize 根据实际数据量选择最小值以节省带宽。对于周期性传感器数据,通常 8-64 字节即可满足需求。