早在第一家公司的时候,有一个印象深刻的Bug,很值得思考。这个Bug充分说明了有缺点的系统架构是怎么在不经意间影响了产品的。
DSP有一个简单的操作系统,可以运行一些task,这些task有一定的优先级,优先级低的task可以被优先级高的中断。
对MCU来说,DSP就是一个外设,它周期性的给MCU发中断,MCU的中断处理程序会在DSP和MCU之间的DPRAM上读取数据。为了同步DSP和MCU对DPRAM的读写,需要设置和检测一些flag寄存器(DSP上)。
DSP上的task有:
优先级最高的中断级任务 Boot Task,FRAME Task,CMD Task,PCM Task。
当CPU的中断来了的时候,CMD Task激活,然后它将激活PCM Task,顾名思义,PCM Task是处理PCM数据的。
下一优先级的任务是MIX Task,它运行Super Foreground Level,每2ms被执行一次,用来混音。
然后,再下一优先级的任务是Speech tasks,运行在Foreground Level,每20ms运行一次,用来处理语音电话数据。
最低优先级的任务是Music Task,运行在Background Level,处理一切跟Music,Tone相关的事情 。
打3G语音电话的时候,MCU和DSP之间的通信可以用这样的一个抽象图来表示:
这样,当Telecom很频繁的发送AMR语音帧时,可能两个连续的语音帧的时间间隔
解决方法很简单,就是增大Buffer的大小,扩容为以前的两倍,这样CPU除非连续三帧来的时间间隔<
DSP读取和回调的时间间隔时,CPU才会丢弃语音帧---这个概率基本是不存在的。
阅读(866) | 评论(0) | 转发(0) |