跳转至

06 Period 尺寸、中断成本与尾延迟

1. 先明确模型边界

N 表示每 period 的 frame 数,一 frame 包含全部声道。假设每 period 恰好通知一次,没有中断合并、轮询或额外唤醒:

通知频率 = fs / N单核固定开销占比 = fs / N × t_context

t_context 是每次通知引起的 CPU 实际执行时间,不是从中断到用户线程运行的全部墙钟延迟;线程等待 CPU 的时间不能当作 CPU 占用相加。真实驱动未必经过 tasklet,也未必每次唤醒都导致上下文切换。

2. 参数敏感度:固定通知成本

以下全部为 48 kHz 下的计算示例,3/10/30 µs 是假设值,不是 ARM64 实测常数。百分比以单个 CPU 核的一秒执行预算为分母,不含解码、拷贝和 DSP 算法。

N(frame) period 时长 通知/秒 3 µs 成本 10 µs 成本 30 µs 成本
16 0.333 ms 3000 0.900% 3.000% 9.000%
64 1.333 ms 750 0.225% 0.750% 2.250%
240 5.000 ms 200 0.060% 0.200% 0.600%
256 5.333 ms 187.5 0.056% 0.188% 0.563%
1024 21.333 ms 46.875 0.014% 0.047% 0.141%

N 减半使通知频率翻倍,这是反比例关系,不是指数增长。较低占用也不保证省电:唤醒频率、其他定时器与空闲状态退出成本共同影响实际电能。

3. ring 容量不是端到端延迟

双声道、4 byte/sample、4 periods 时:

N 每 period 字节数 ring 字节数 ring 满载时音频时长
64 512 2048 5.333 ms
240 1920 7680 20.000 ms
256 2048 8192 21.333 ms
1024 8192 32768 85.333 ms

实际排队时间取决于当前 queued frames、启动阈值和读写策略,不能直接把 ring 容量作为固定延迟。算法块长、重采样群延迟和硬件 FIFO 是不同项;同一段缓冲不能重复计入。

4. 平均成本之外,还要验证期限

例如 N=64 的 period 仅 1.333 ms。若某次调度等待加处理时间为 2 ms,是否 XRUN 取决于当时剩余播放数据,而不是平均 CPU 是否低于 1%。应比较:

调度等待 + 处理 + 提交时间 < 当前安全水位 / fs

播放检查剩余可播放 frame;录音检查剩余空闲 frame。中断合并或突发补交会使实际唤醒节奏偏离 fs/N。

5. 可复现的选择流程

  1. 固定设备、内核、格式、声道数和功耗策略,读取协商后的实际 period/buffer 参数;请求值未必被原样接受。
  2. 逐档扫描设备支持的 N,而不是假定所有平台支持 64/256 或某个 FAST 标志。
  3. 每档记录 CPU 执行时间、调度等待分布、最大等待、XRUN、实际回环延迟和电池侧功率。
  4. 重复加入内存压力、网络突发、DVFS 和后台任务,保持输入和时长一致。
  5. 按产品允许的延迟、功耗与失效率选取有余量的档位。没有适用于所有移动终端的最佳 N。

测量表应保留硬件/内核版本、测试时长和原始 trace。未运行硬件实验前,本页只证明预算关系,不宣称某个配置达到量产标准。

参考:ALSA PCM 参数与状态