60 秒回答模板

设备返回 NACK 时,驱动层要先判断发生在地址阶段还是数据阶段,以及是偶发还是持续。地址 NACK 可能是设备未上电、复位中、地址错、总线频率太高、上拉波形差,或者像 EEPROM 写周期内暂时忙;数据 NACK 可能是命令非法、寄存器地址不支持、设备状态不允许继续写。处理策略不能固定:对明确可恢复的忙状态可以做有限次数、带延时的重试;对参数错误、地址错误或持续 NACK 要把 -ENXIO、-EIO 等错误上报给上层;如果伴随 SDA/SCL 卡低、仲裁丢失、控制器超时,就要做 bus recovery 或复位从机。结合上拉和频率时,可以说波形上升慢、高速采样不稳会导致 NACK,需要降频、调整上拉或用示波器确认。关键是有限重试、保留错误码、避免无限循环,并用日志区分协议错误和电气问题。

考点 分类决策树
难度 真实面经题
回答目标 说明自己能把总线协议错误、电气问题和驱动错误处理策略区分开。

深入解析

01

NACK 先看发生位置

地址阶段 NACK 说明目标设备没有确认这个地址;数据阶段 NACK 说明设备收到了地址但拒绝当前数据或命令。两者指向的根因不同,不能混为一谈。

02

重试只适合瞬态场景

设备忙、刚复位、写周期未完成或轻微仲裁冲突可以有限重试。重试应有次数、间隔和超时,并记录统计,不能在内核里无限等待。

03

持续错误应向上传递

地址配置错、设备缺失、寄存器非法或硬件未焊接时,重试不会解决问题。驱动应返回明确错误码,让 probe 失败、用户态报错或上层状态机进入降级。

04

总线异常才做恢复

如果控制器报告总线忙、SDA/SCL 被拉低、超时或仲裁异常,问题不只是一次 NACK,应执行总线恢复、控制器复位或从机复位,并重新初始化。

易错点

  • 所有 NACK 都无限重试,导致内核线程卡死或启动卡住。
  • 所有 NACK 都直接复位总线,掩盖设备忙或上层参数错误。
  • 不区分地址 NACK 和数据 NACK,错误定位很粗。
  • 只看软件返回值,不检查上拉、电容、频率和实际波形。

面试官追问

为什么 EEPROM 写入后常用 ACK polling?

写周期内器件可能暂时不响应地址,主机用有限地址重试判断内部写入完成,这是有明确语义的忙等待。

NACK 后一定要复位总线吗?

不一定。单次地址或数据 NACK 可能只是设备忙或命令非法;只有总线状态异常、线被拉低或控制器卡住时才需要恢复总线。

如果面试官让你现场排查,你会先看哪些证据?

我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。