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

发布者:JFET最新更新时间:2014-10-25 来源: 互联网关键字:DSP  汇编语言  C/C++ 手机看文章 扫描二维码
随时随地手机看文章

  在的开发中,常用的算法都可以用代码来高效实现。但是对一些特殊寄存器的读写,例如某些CPU寄存器的读写,因为代码无法直接对其访问,仍然需要使用汇编代码进行操作。此外,在一些对代码执行时间要求很严格的算法,例如很多个点的FFT、IFFT中,汇编代码的高效仍然是所不能替代的。这些就涉及到了C/C++代码与汇编代码的接口问题,在此我们就来了解一下它们是如何交互的。首先要遵循以下的九大原则:

  1. 所有的函数(不管是C/C++的还是汇编的)都要遵循特定的寄存器约定

  寄存器约定用来规定编译器如何使用寄存器,主要指的CPU/FPU的寄存器(因为它们在程序运行中是反复使用的),并且在函数调用前后如何保存寄存器的值。保存寄存器值的方法分为在函数入口处保存和在调用时保存,前者是由被调用的函数来完成的,后者则是由调用别的函数的函数来完成的。在TMS320C28x编译器中,使用如下的规则,如表1、表2所示。通过表1、2,我们还可以对CPU/FPU的寄存器有进一步的理解,这样以后再看到寄存器的名字时就不至于一头雾水了。

  表1 CPU寄存器使用和保留的约定DSP编程技巧之23---C/C++与汇编语言的交互之-(1)链接汇编代码与C/C++代码

  表2 FPU寄存器使用和保留的约定DSP编程技巧之23---C/C++与汇编语言的交互之-(1)链接汇编代码与C/C++代码

  编译器对CPU的状态寄存器ST中的某些位也有一定的约定,如表3、表4所示;没有列在表中的状态寄存器的位则不受编译器的影响。对其中的某些位,编译器会假设它们在函数调用或者返回时具有特定的假想值;在系统初始化建立C语言的实时运行环境时,这些位也会被初始化为特定的假象值。

  表3 CPU状态寄存器ST的约定DSP编程技巧之23---C/C++与汇编语言的交互之-(1)链接汇编代码与C/C++代码

  表4 FPU状态寄存器STF(1)的约定DSP编程技巧之23---C/C++与汇编语言的交互之-(1)链接汇编代码与C/C++代码

  (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]]]

关键字:DSP  汇编语言  C/C++ 引用地址:DSP编程技巧---C/C++与汇编语言的交互之-(1)链接汇编代码与C/C++代码

上一篇:Lattice公布2014三季度财报,收入8660万
下一篇:基于射频技术的穿戴式医疗仪器的设计

推荐阅读最新更新时间:2024-05-02 23:15

DSP芯片的分类
DSP的芯片可以按照以下的三种方式进行分类。 1、按基础特性分 这是根据DSP芯片的工作时钟和指令类型来分类的。如果DSP芯片在某时钟频率范围内的任何频率上能正常工作,除计算速度有变化外,没有性能的下降,这类DSP芯片一般称之为静态DSP芯片。 如果有两种或两种以上的DSP芯片,它们的指令集和相应的机器代码机管脚结构相互兼容,则这类DSP芯片称之为一致性的DSP芯片。 2、按数据格式分 这是根据DSP芯片工作的数据格式来分类的。数据以定点格式工作的DSP芯片称之为定点DSP芯片。以浮点格式工作的称为DSP芯片。不同的浮点DSP芯片所采用的浮点格式不完全一样,有的DSP芯片采用自定义的浮点格式,有的DSP芯
[嵌入式]
汽车音频工程师的DSP开发方法论
当“汽车”与“电子”这两个词开始出双入对,就注定了DSP成为乘客的命运,毕竟哪里有电子,哪里就大概率有数字信号,而哪里有数字信号,哪里就是DSP的舞台。如今,DSP已经广泛应用于汽车的各个功能。比如在发动机上,DSP可获取并分析各气缸内压力数据,然后输出控制信号,使发动机处在最佳点火时刻和空燃比的状态;在底盘上,DSP可获取ABS系统数据,进而保证车辆的稳定性;在安全气囊上,DSP可以实现对点火电流的反馈控制,使安全气囊在准确的时间点展开;在新能源汽车上,DSP可对电池进行管理…… 随着汽车电子的发展,DSP在汽车上的应用场景越来越多。而汽车上有一个较为传统的应用场景,也随着DSP技术的发展而不断进化,那就是影音娱乐。早在19
[汽车电子]
汽车音频工程师的<font color='red'>DSP</font>开发方法论
基于P89C51RD2 IAP功能的数据存取与软件升级
摘要:分析Boot ROM中的部分源代码,重点是IAP功能以及ISP和IAP的相互关系;应用IAP功能将剩余程序空间转化为数据空间,以及自编ISP程序来实现仪器的软件升级。 关键词:P89C51RD2 Boot ROM IAP(ISP)功能 软件升级 1 概述 P89C51RD2是Philips公司的80C51系列单片机中的佼佼者,具有1KB的片上RAM和64KB的片上内存;具有3种编程方式,即在系统编程ISP(InSystem Programming)、在应用中编程IAP(In-Application Programming)以及通过商用编程器的并行编程。ISP是指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路
[单片机]
基于AT89C51的时间/位移换向控制器设计
引言 在实际生产过程中,常常要用到具有自动换向功能的控制部件,如机械加工中的往返运行(位移),直流电源的正反向输出,电动机的正反转运行等现象,都是当正向(或反向)运行到一定时间或一定位置时,自动换为反向(或正向)运行,周而复始的过程。实现这一过程的自动化,就是设计一套控制电路,再配以位移传感器或时间继电器。目前市场现有的时间继电器虽然可以用多个组合来满足一些使用场合的要求,但仍存在着重复计时误差大,稳定可靠运行性不高,使用不方便灵活等问题。为此,笔者研发了以单片机为核心组成的时间/位移换向控制器SWHX-1,该系统具有成本低等特点,可完全且克服以上不足。 电路组成及工作原理 SWHX-1的内部电路如图1所示。该系统分
[单片机]
嵌入式操作系统μC/OS-Ⅱ面向数控系统的改进
嵌入式操作系统μC/OS-Ⅱ是一个可裁剪、源码开放、结构小巧、抢先式的实时多任务内核,主要面向中小型嵌入式系统,具有执行效率高,占用空间小,可移植性强,实时性能优良和可扩展性强等特点。数控系统是一个典型的强实时性系统,具有可确定性。可确定性主要是确保条件出现到由此引起的动作开始(或者结束)的时间在一个准确的时段内。在数控系统中,条件是由操作员的指令(如:紧急停止、移动x轴等)或是机床的状态(如刀具破损等)引起的。本文分析了数控系统任务的特点,结合μC/OS-Ⅱ的内核体系,对μC/OS-Ⅱ的任务分类、任务调度和中断服务策略做了改进,使其更加适合于数控系统的应用。 1 μC/OS-Ⅱ对任务的分类 μC/OS-Ⅱ中每个任务有5种状态:
[嵌入式]
基于S3C44B0X的嵌入式Socket通信设计
随着微电子技术的不断创新和发展,嵌入式系统已经广泛渗透到科学研究、工程设计、国防军事、自动化控制领域以及人们日常生活的方方面面。由嵌入式微控制器组成的系统其最明显的优势就是可以嵌入到任何微型或小型仪器和设备中。 嵌入式系统是指将应用程序、操作系统与计算机硬件集成在一起的系统。它以应用为中心、以计算机技术为基础,而且软硬件可以裁剪,因而是能满足应用系统对功能、可靠性、成本、体积和功耗的严格要求的专用计算机系统1。嵌入式系统与通信、网络技术的结合可以极大地增强网络的智能化与灵活性,拓展通信功能,从而实现各种通信系统之间的互联互通。本文给出一种适合于中/低端应用的通信平台设计方案,它可支持Ethernet网络之间的数据传输,并且具
[单片机]
基于STC89C52和IC射频卡设计的射频识别锁系统解决方案
射频识别技术,主要是一种非接触式的自动识别技术,在其应用的过程当中,需要在电磁原理的基础上利用射频信号来对目标对象进行信息的获取,由于其应用的广泛,可以实现在不同区域内的应用,因此被广泛的应用在了各种环境的作业当中。在射频识别系统当中,射频读卡器的输出数据需要严格遵守Wieggand格式当中对其作出的规定,也就是利用两根传输分别为0和1的数据线进行传输。 基于单片机和射频识别技术的门禁系统是基于单片机STC89C52和IC射频卡设计的射频识别锁系统,可用于实验室、机房、办公楼、档案室、财务室等安全性要求较高的场所. 1、系统设计方案 此门禁系统由安装在门上的客户端和对新卡进行授权写入的授权端两部分组成.客户端由电源模块、单
[单片机]
基于STC89<font color='red'>C</font>52和IC射频卡设计的射频识别锁系统解决方案
s3c2440(2410) USB HOST不稳定的原因及解决方法
今天tpu拿出一块2440板子调试,发现尽管采取了种种措施,USBHOST总是会偶尔不工作.把UCLK通过CLKOUT0引出,用示波器查看,发现不工作的时候,UCLK根本就没有稳定下来.于是仔细思考,影响USB的有这几个地方: 外部晶振16.9344Mhz LOCKTIME寄存器的UPLL LOCKTIME UPLLCON CLKSLOW寄存器的UPLL开关 接下来逐个排除: 晶振是MPLL和UPLL公用,从来没听说过MPLL不稳定的. 怀疑LOCKTIME太大(0xffff),但改小了没有效果. 在UCLK不稳定的时候,重复设置UPLLCON是没有用的. 在UCLK不稳定的时候,开关UPLL,有效果!在UCLK
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved