语音播放中断服务例程主要完成的工作是,当产生语音中断时,仍然有数据需要播放,则向语音数据发送缓冲区FIFO中写入指定数据,剩下的工作由Codec芯片本身来完成。中断服务例程ISR的伪代码如下(因为具体实现代码没有通用性,故此处用伪码描述):
void IRQ_Codec_Handler(void)
{
while(检测系统状态寄存器,发现语音芯片数据发送缓冲区FIFO非满)
{
if(已经播放过的语音数据长度<给定的需要播放的语音数据长度)
{
向语音芯片发送数据缓冲区FIFO写入指定数据;
调整已经播放过的语音数据长度;
if(已经播放过的语音数据长度>=给定的需要播放的语音数据长度)//结束
{
禁止数据发送缓冲区中断;
复位各相关的全局变量;
程序返回;
}
}
else
{
向语音芯片发送数据缓冲区FIFO写入默认数据
0XFF;
}
}
}
3 试验结构和分析
由于在设计阶段充分考虑过语音合成算法的大运算量和系统的实时性要求,故我们在具体实现的时候也采取了一些措施,比较突出的有:用ARM汇编语言来实现关键性的函数代码;语音合成时提高处理器EP7211的工作频率(处理器正常工作频率是18MHz);对于一些常用的三角函数计算,采用查表的方式等来加快程序执行速度。在PDA样机测试中,单字符合成时间在650ms左右,基本上能够满足实际应用需求。数据语音库经过处理之后,占用了729560字节也能够满足本PDA系统的存储的要求。 当PDA系统收到1条个人传呼信息时,在语音库的支持下,立刻启动语音合成算法,逐个进行字符语音合成。当第1个字节语音合成结束后,立刻启动语音中断服务例程进行语音播放。这样收到的个人传呼信息,前台逐个字符解码时,其后台语音播放也在进行。根据实际测试参数,基本上满足了系统的实时性要求。
从一定角度看,单字符650ms的语音合成时间基本能够满足实际应用需要,但还是希望能够进一步减小这个值。这由于我们对ARM算是器的使用还处在研究阶段。ARM本身提供了16位的Thumb指令集和32位的ARM指令集,而且两者在某些方面表现出较大差别。一般来讲,Thumb代码长度是ARM代码长度的65%,而执行效率要经后者高出60%。但在某些方面,32位ARM指令集也会表现出其优于16位Thumb指令集的强大功能;同时该处理器系统支持ARM指令庥和Thumb指令集混合编程模式。随着对二者差别和各自优势的深入理解,结合本系统的硬件体系结构,采用有效的指令集混合编程模式将会使程序执行效率进一步提高,从而使实时性得到进一步加强。