137、描述符配置错误导致的通知无法开启
一个让人抓狂的"哑巴"外设前两年做一款便携式数据采集终端,主控和一颗协处理器之间走的是高速串行总线。协处理器负责前端模拟信号的采样和预处理,主控通过总线向它下发配置、读取结果。功能验证到一半的时候,遇到了一个非常诡异的问题:协处理器可以正常被枚举、寄存器读写全部正常、数据搬运也跑得通,唯独中断通知死活上不来。主控侧的中断服务程序从来没被触发过,只能靠轮询去读状态寄存器,功耗和实时性都很难看。当时第一反应是怀疑中断控制器配置、GPIO复用、时钟使能这些常规项,查了一圈没发现问题。后来又怀疑是协处理器固件里中断上报逻辑没写对,折腾了两天,最后用逻辑分析仪抓到总线上的配置阶段数据,才定位到根因:主控在初始化阶段写入的中断描述符配置项里,有一个字段填错了。这个字段决定了中断是"边沿触发"还是"电平触发",我填成了边沿,而协处理器实际输出的是电平保持信号,两者对不上,中断自然永远进不来。这个坑让我印象极深。描述符这种东西,在手册里往往就是一张表、几行字段说明,看起来人畜无害,但字段之间的依赖关系、默认值的陷阱、以及和硬件实际行为之间的耦合,公开资料里几乎不会展开讲。下面把这类问题的排查思路和几个隐蔽陷阱拆开说。描述符到底在描述什么在很多总线协议和片上互联架构里,设备初始化阶段都需要主控向从设备(或者向互联矩阵)写入一段结构化的配置数据,这就是描述符。它通常包含几类信息:设备身份信息:用于匹配和路由资源分配信息:地址窗口、缓冲区基址、大小中断相关配置:中断号、触发方式、优先级、使能位属性配置:传输模式、位宽、时序参数