一次DEBUG经历

来源:互联网 发布:pg数据库与oracle区别 编辑:程序博客网 时间:2024/05/16 18:00

不久前在项目中遇到一个BUG,解决的过程不算复杂,但能说明一些问题。

项目背景:

     在项目中我负责的保全模块中(这个以后也写写),当用户开关保全以及设定条件被触发时使用音频解码通道播放一段G726格式音频。

相关硬件:HI3510 ,WM8731 相关软件:音频解码播放代码,WM8731 driver

 

问题描述:测试人员发现有时会出现无声现象。

 

解决过程:

1.怀疑编码不当导致解码通道操作错误,检查代码后排除。

2.仔细观察问题发生状况,发现问题有如下特点,如果该板在启动后无声,则一直无声,而如果启动时声音正常则运行过程中不会出现无声现象。初步定位到系统初始化阶段。

3.检查应用程序初始化过程,无果,怀疑DRIVER出现问题。

4.用示波器观察HI3510 I2S输出通道,发现在有声和无声的情况下I2S总线上均有正常数据,怀疑驱动有时将WM8731初始化为静音,询问驱动开发人员得知静音接口未暴露给应用层,猜测错误。

5.因为I2S数据一直正确,可以判定应用层音频解码无误,问题出在DRIVER,但编写驱动的同事较忙,而WM8731驱动并不复杂,索性自己检查。

6.仔细检查驱动代码,并无逻辑错误,仔细阅读DATASHEET,在一个不起眼的地方有如下一句:

it is recommendded that between changing any content of Digital Audio Interface or Sampling  Control Register that the active bit is reset then set

对照驱动代码,正好忽略了这一点,而系统的驱动恰恰加载了两次,才造成了音频接口出错出现无声,在设置sample rate 的地方关掉接口然后再打开,一切OK。

 

结论:一个59页的DATASHEET,被忽略了的两行造就了这个BUG,在万事俱备的情况下,细节决定成败。为了避免这样的隐患,在做的过程中尽量细心,不放过任何一个细节,。

 

 

原创粉丝点击