- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
如何利用C和汇编语言混合编程实现DSP软件设计
调试混合代码的应用程序
汇编代码的调试需要对延迟和存储器对齐限制等架构和机器级问题有深入的了解。只是简单地把C代码和汇编代码放在一起会使事情更麻烦,因为编程人员现在还必须调试C代码和汇编代码之间的连接。
调试混合代码应用程序的第一步就是分隔问题。假设保持汇编代码的C语言实现不变以及C语言实现方案工作正常,那么将汇编函数转换成C语言实现并重新测试应用程序就相对比较容易。为了迅速检测出问题,编程人员可以在每一步把受怀疑函数的一半转换为相应的C语言实现方案。
一旦有问题的汇编函数被确定,它就应该同时作为独立的汇编问题和C与汇编的连接问题加以分析。调试独立的汇编问题对汇编编程人员来说十分简单明了,但C与汇编的连接问题就有点麻烦。在考虑汇编函数本身时,C与汇编的连接问题是不可见的,这与独立的汇编问题有所不同。为了找出这些问题,编程人员必须检查编译器的约定,比如调用约定和寄存器使用约定。
编程人员还必须检查编译器假设,比如汇编指令的行踪。为了节省调试时间,编程人员应该在第一次实现汇编函数时验证是否遵循所有的编译器约定和假设。
案例研究:H.264视频编码器和AMR-NB
本文讨论的技术和方法已被CEVA公司用于各种各样的应用,包括视频编解码器、音频编解码器、声音合成器和设备驱动器。而本文所述的功能在这些应用中都可以显著提高性能。H.264视频编码器是一个很好的研究案例。它在处理能力及其它资源方面要求非常严格,尤其是相比语音编解码器等其它类型的编解码器而言。
CEVA公司的CEVA-X16xx高端DSP内核系列及其MM2000多媒体平台可以为这种编码器提供所需的处理能力。先用高级跟踪技术确定这种编码器的关键函数,然后逐步对之进行优化。首先,利用汇编内部函数在C语言级对这些函数进行全面优化。然后,在汇编语言级对编译器提供的汇编代码作进一步优化。
图6展示了通过对这种编码器的关键函数进行全面优化所获得的性能提高。只有最后一个优化阶段涉及到纯汇编编程,所有其它阶段都基于带有汇编内部函数的C代码。这些汇编内部函数主要用于SIMD操作,如avg_acW_acX_acZ_4b。这条指令对8个输入字节取平均,产生4字节结果。这种SIMD操作对执行大量字节级计算的视频编解码器非常有用。
图6:对H.264编码器的关键函数进行优化以提升性能。
AMR-NB(自适应多速率-窄带)是广泛用于无线通信应用的语音编解码器。通常都是采用纯汇编来实现声音合成器,但C语言实现与CEVA-X1620编译器利用本文讨论的各种功能可以获得与汇编实现媲美的结果。图7显示了整个AMR-NB应用经过全面优化而取得的以MCPS(每秒百万周期)计的性能提高幅度。只有最后的优化阶段涉及到了纯汇编编程,所有其它阶段都基于带有ETSI内部函数和汇编内部函数等的C代码。
图7:通过各种优化方法取得的ARM-NB性能改进。
总之,H.264编码器和AMR-NB例子清楚地表明了汇编实现方案的性能优势,但也表明纯汇编实现并非首选的优化方法。利用高质量软件开发工具提供的C与汇编功能,DSP编程人员无需纯汇编语言也能使整个应用程序达到令人满意的性能。
来源:维库开发网