如何利用C和汇编语言混合编程实现DSP软件设计..docVIP

如何利用C和汇编语言混合编程实现DSP软件设计..doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何利用C和汇编语言混合编程实现DSP软件设计.

如何利用C和汇编语言混合编程实现DSP软件设计内容摘要:除了调用约定和寄存器使用约定外,一些编译器在人工编写的汇编代码方面可能还会有一些额外的假设。硬件寄存器绑定C变量:该功能经常与汇编指令内联功能结合在一起,帮助内联汇编代码访问C语言级的变量(见图3)。 关键词: 编程人员 指令调度 寄存器分配 汇编语言 ARM-NB pushd 实现方案 和函数 DSP应用 DSP处器 众所周知,汇编语言具有更高的性能优势,而用C语言编码则能更容易和快速地实现。DSP处理器功能的不断增强以及编译器优化技术的提高,使得传统的用汇编语言编写DSP应用程序的做法逐渐被淘汰。现在的DSP应用程序几乎都是由C代码和汇编代码混合组成的。在那些对性能起决定性作用的关键功能中,DSP工程师将继续使用高度优化的汇编代码,同时转用C语言编写那些不太关键的功能,这将有利于代码维护和移植。而C和汇编代码的这种结合要求DSP工程师具备专门的工具和方法。 正确混合C代码和汇编代码 问题是在哪里划分C代码和汇编代码的界限。这取决于跟踪器(profiler)所能提供的性能分析结果。然而在使用跟踪器之前,DSP工程师需要为应用程序定义清晰的目标,这些目标一般包括循环数、代码规模和数据量。目标一旦确定后,应该先全部用C语言编写和创建应用程序,然后才使用跟踪器来分析性能。 在某些特定情况下,主要是控制应用中,C语言级的编码就足够了。但在大多数情况下,初始编写的C语言应用程序是不能满足一个或更多目标要求的。这通常意味着多少需要一些汇编代码。在求助于汇编编程之前,强烈建议保存原始的C代码。这样不仅方便调试,而且当条件成熟(比如采用更强大的平台),还可以返回到这些C语言的实现。 汇编部分代码应尽可能少。为此,工程师需要认真分析跟踪器提供的性能结果,并确定应用程序中的关键函数。关键函数是指占用大部分执行时间,而必须用汇编语言重写才能满足性能目标的那些函数。重写其中的几个关键函数后,需要重新进行性能分析。如果仍达不到目标要求,那就应该确定其它关键函数,再进行重写。图1显示了利用专用硬件机制获得高度优化的汇编代码。 图1:用C语言创建的循环缓冲器代码(左)以及由CEVA-TeakLite-III创建的等效汇编代码(右)。 对编译器的考虑事项 在编写需要与C代码结合的汇编代码时,汇编编程人员必须了解编译器的约定和假设。汇编编程人员还必须了解编译器的寄存器使用约定。通常,寄存器使用约定将硬件寄存器分成被调用方保存(或调用方使用)和被调用方使用(或调用方保存)寄存器。 图2给出了从CEVA-X1641 DSP内核FFT实现中摘取的汇编代码例子。左边第二行的add指令符合CEVA-X1641编译器传递r0地址寄存器中指针参数的调用约定。右边的pushd指令用于备份后面函数会用到的被调用方保存寄存器。 图2:从CEVA-X1641 DSP内核的FFT实现中摘取的一段汇编代码。 除了调用约定和寄存器使用约定外,一些编译器在人工编写的汇编代码方面可能还会有一些额外的假设。这些假设通常是专门针对某个编译器的,因此编译器提供商会提供完善的资料和说明。 用于C和汇编连接的常用C语言扩展 用于嵌入式平台的大多数编译器,特别是用于DSP编程的编译器,都具有丰富的C语言和汇编语言连接功能。其中绝大部分功能不属于标准C语言,因此被称为C语言扩展。下面列出的是其中有益于DSP编程的一些功能。 内联汇编(inline assembly):该功能可以帮助编程人员将汇编指令插入C代码。 硬件寄存器绑定C变量:该功能经常与汇编指令内联功能结合在一起,帮助内联汇编代码访问C语言级的变量(见图3)。 图3:结合内联汇编和硬件寄存器绑定功能的代码示例。 存储区属性:该功能允许编程人员将上述变量和函数分配到独特的用户定义存储区,可以让编程人员将C语言级单元分配到实际的存储器位置,这对DSP应用来说非常关键。 用户定义的调用约定:在某些情况下,汇编函数可以通过用户定义的调用约定取得更好的优化效果。 编译器内部函数(Compiler intrinsics):是指能够使用专门的宏或函数调用触发的内建编译器功能总称。没有内部函数支持的编译器必须调用用户定义的函数,这样做可能会令用户定义函数可能会在一个环路里产生函数调用和返回(见图4),从而产生巨大的开销。ETSI的MULT_R(乘法和取整)基本操作的C代码实现(左)和对应的由CEVA-TEAKLITE-III编译器生成的汇编代码(右)。i]M*lN4z9@ydb0sZMTx!j?K=z@?rB.v2人力资源论文=dg ffN51!;eZ/=W.P1Sv$,U1M 汇编内部函数:是将汇编代码内联进C代码的一种先进方法,下文将有详细介

文档评论(0)

stzs + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档