在DSP的开发中,常用的算法都可以用C/C++代码来高效实现。但是对一些特殊寄存器的读写,例如某些CPU寄存器的读写,因为C/C++代码无法直接对其访问,仍然需要使用汇编代码进行操作。此外,在一些对代码执行时间要求很严格的算法,例如很多个点的FFT、IFFT中,汇编代码的高效仍然是C/C++所不能替代的。这些就涉及到了C/C++代码与汇编代码的接口问题,在此我们就来了解一下它们是如何交互的。首先要遵循以下的九大原则:
1. 所有的函数(不管是C/C++的还是汇编的)都要遵循特定的寄存器约定
寄存器约定用来规定编译器如何使用寄存器,主要指的CPU/FPU的寄存器(因为它们在程序运行中是反复使用的),并且在函数调用前后如何保存寄存器的值。保存寄存器值的方法分为在函数入口处保存和在调用时保存,前者是由被调用的函数来完成的,后者则是由调用别的函数的函数来完成的。在TMS320C28x编译器中,使用如下的规则,如表1、表2所示。通过表1、2,我们还可以对CPU/FPU的寄存器有进一步的理解,这样以后再看到寄存器的名字时就不至于一头雾水了。
表1 CPU寄存器使用和保留的约定
表2 FPU寄存器使用和保留的约定
编译器对CPU的状态寄存器ST中的某些位也有一定的约定,如表3、表4所示;没有列在表中的状态寄存器的位则不受编译器的影响。对其中的某些位,编译器会假设它们在函数调用或者返回时具有特定的假想值;在系统初始化建立C语言的实时运行环境时,这些位也会被初始化为特定的假象值。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !