您的位置 首页 国产IC

DSP编程技巧—C/C++与汇编语言的交互之-(1)链接汇编代码与C/C++代码

在DSP的开发中,常用的算法都可以用C/C++代码来高效实现。但是对一些特殊寄存器的读写,例如某些CPU寄存器的读写,因为C/C++代码无法直接对其访问,仍然需要使用汇编代码进行操作。此外,在一些对代

  在DSP的开发中,常用的算法都能够用C++” target=”_blank”>C++/C++” style=”margin: 0px; padding: 0px; outline-style: none; color: rgb(0, 51, 153); text-decoration: none;”>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言语的实时运转环境时,这些位也会被初始化为特定的假象值。

  表3 CPU状况寄存器ST的约好

  表4 FPU状况寄存器STF(1)的约好

  (1)未运用的STF寄存器的位,读取为0,写无效。

  (2)运用MOVST0寄存器的时分,STF寄存器的特定标志位能够复制到ST寄存器中。

  (3)LVF和LUF能够连接到PIE(外设中止扩展)中,然后触发上溢/下溢中止,在调试进程中能够协助咱们确诊浮点数的溢出问题。

  (4)假如RNDF32或许RNDF64是0,则取整形式为切断,否则是近似到最近的整数。

  2. SP的运用、结构体的回来方法

  请参阅函数的调用进程:http://www.eepw.com.cn/article/262925.htm

  3. 长整形和浮点型在保存时,LSW(Least Significant Word,低有效字)保存在地址中。

  4. 除了全局变量的初始化以外,汇编模块不该运用.cinit段。这是由于C/C++的发动代码假定在.cinit段中只包含了初始化表,假如把其它的信息存入这个段中,将导致不行猜测的运转成果。

  5. 编译器会主动为一切的标识符前面加上一个下划线,比如在C/C++中的某个函数姓名为xxx,则编译成汇编代码时,它的称号变为_xxx。在这种转换规矩下,咱们在C/C++中编程时,函数、变量的称号就不能以下划线“_”来最初了。

  6. 链接器会主动为外部方针分配链接名,所以在用汇编代码编写程序的时分,也要运用相同的姓名才干被链接器正确辨认。通用的规矩是:

  _func__F parmcodes

  例如,咱们有一个C++函数:

  int foo(int i){ } //global C++ function

  转换为汇编之后变为:

  _foo__Fi ;foo为函数名,它有一个int类型的参数

  7. 为了让汇编代码中的变量和函数能在C/C++代码中调用,在汇编中编程中需求运用.def或许.global指令对它们进行界说。假如期望从汇编代码中调用C/C++中的函数或许变量,则在汇编代码中需求运用.ref或许.global指令对它们进行界说。

  8. 由于复位之后,编译的C/C++代码运转PAGE0形式下,所以假如在汇编函数中把PAGE0位修正成了1,在回来时必定要记得把它康复为0。

  注:PAGE0位为0时,运用栈寻址形式,为1时则运用直接寻址形式。

  9. 假如在汇编代码中运用了结构,而且期望在C代码中运用extern struct指令来调用它,则这个结构应当被模块化(在汇编指令的选项中启用模块化标志,并为其分配接连的存储空间),然后优化DP的加载。在汇编代码中运用.usect或许.bss指令能够来指定结构的模块化,运用办法为:

  .usect “section name”, size in words[, blocking flag[, alignment flag[, type] ] ]

  或许

  .bss symbol, size in words[, blocking flag[, alignment flag[, type]]]

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/226818.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部