各位专家:
我正在使用两块C6455DSK板,做两路音频编解码+网络传输的一个应用项目,编解码采用了G.729标准,开发环境为CCS3.3,使用了DSP/BIOS。在程序开发过程中,碰到了以下难题,苦苦不得其解,特向专家请教:
代码中,对McBSP1进行了配置,从AIC23读取AD进来的语音数据,然后通过DMA乒乓方式,每10ms中断一次CPU,然后进行编码,编码后数据通过网口UDP方式发送。接收端收到压缩数据时,通过解码器进行解码,然后再通过DMA送到McBSP,通过AIC23放音。现在每次启动之后,可以正常运行20-40分钟不等,之后就不再正常工作,不再正常播放声音,DMA中断不再能够正常进入中断函数,这个时候,将程序暂停进行了如下的诊断。
1.检查了6455的核寄存器,状态如下:CSR=10000103;IER=00004123(DMA采用了INT8,网口采用了INT5,这里看,中断没有被关闭),IERR=00000009;是不是说明发生了内部异常,查看用户指南,发现这里说明是取指令异常和opcode异常。EFR=00000002,也说明产生了内部异常。TSR=0000840D,是否说明此时,DSP可以处理各种异常?
2.继续运行,停下来,再运行。。。。。。。。。。。。。。发现IFR有时候为0000C008,还有时候为00008008,而正常运行时,显示均为00008008。运行时,TSR有时候为0000040C,有时候为0000040D,暂停的时候为0000840D或者0000040D。
3.暂停程序的时候,程序分别停在了一些sts.o64P (.bios)、lnkrtdx.a64P : rtdx.o64P (.bios)、 idl_busy.o64P (.bios)等地方,由于对BIOS是不是特别了解,不知道程序为什么会在这些bios的系统函数里面跑。
4,暂停时,观察了DSP/bios菜单下面的message log窗口:显示如下:4231746 CLK: current time = 682540 (0x000a6a2c)
4231747 PRD: tick count = 682540 (0x000a6a2c)
4231748 SWI: post KNL_swi (TSK scheduler) (0x827cd8)
4231749 SWI: begin KNL_swi (TSK scheduler) (0x827cd8)
4231750 TSK: ready Encoder_decoder (0x00827bcc)
4231751 TSK: running Encoder_decoder (0x00827bcc)
4231752 SWI: end KNL_swi (TSK scheduler) (0x827cd8) state = done
4231753 SWI: begin KNL_swi (TSK scheduler) (0x827cd8)
4231754 TSK: blocked Encoder_decoder (0x00827bcc) on <unknown handle> SEM
4231755 TSK: running dynamic TSK (0x00827b6c)
4231756 SWI: end KNL_swi (TSK scheduler) (0x827cd8) state = done
4231757 CLK: current time = 682541 (0x000a6a2d)
4231758 PRD: tick count = 682541 (0x000a6a2d)
4231759 SWI: post KNL_swi (TSK scheduler) (0x827cd8)
4231760 SWI: begin KNL_swi (TSK scheduler) (0x827cd8)
4231761 SWI: end KNL_swi (TSK scheduler) (0x827cd8) state = done
每次暂停,发现最后两句话,都是4231760 SWI: begin KNL_swi (TSK scheduler) (0x827cd8)
4231761 SWI: end KNL_swi (TSK scheduler) (0x827cd8) state = done
碰到这些问题,严重影响了进度,还请各位专家,帮我仔细分析分析,不胜感激。我目前有几点自己的理解和疑惑:
1.看来是碰到了一些异常情况的发生,我应该怎么处理这些异常呢,目前我做了这样的尝试:就是把DSP/BIOS可视化界面里面的,system->SYS->system settings里面的Abort function、error function 和exit function响应函数全部改成了自己的一段程序,在这段程序里,做了一些寄存器的初始化工作,然后跳到Cint00继续运行,仍然没有改善目前碰到的情况,不知DSP/BIOS究竟怎么处理异常情况的发生??????????????
2.目前有一个思路,就是碰到异常发生时,损失一点系统的性能,全部进行硬重启,就是通过电源监控芯片进行DSP硬复位,但是现在不知道,究竟在那些地方有异常处理函数,以便改写这些函数。
一个认真学习DSP开发的初学者,恳请解答,感谢!!