网站大量收购独家精品文档,联系QQ:2885784924

第6章C语言和汇编语言混合编程C55x DSP.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章C语言和汇编语言混合编程C55x DSP

第6章 C语言和汇编语言混合编程   在很多DSP应用中都使用C语言和汇编语言进行混合编程。C语言具有可读性高、便于维护和可移植性好等优点,然而汇编语言具有实时运行效率高和代码效率高的优点。使用汇编语言可以更充分地利用DSP的硬件资源,例如乘累加单元、单指令重复、块重复和块移动等。   某些程序使用汇编语言编写时,实时运行效率是C语言的几十倍或更多,运算量越大,汇编语言编写的程序实时运行效率越明显。用C函数调用汇编子程序和C函数一样有参数传递和返回问题,下面介绍用C函数调用C55x汇编子程序的方法。 6.1.1 C语言和汇编语言之间名称转换   C函数调用汇编子程序时,汇编程序所有变量名和子函数名需加前缀下划线“ _ ”,例如使用_sum作为汇编语言程序子函数名。如果汇编程序中定义了变量,必须加前缀下划线,C函数才能使用该变量。前缀“ _ ”只在C编译时使用,当我们用C函数调用汇编子程序和变量时,不需要加前缀“ _ ”。以下是C函数调用汇编子程序的例子。 //C源程序:   extern int sum(int *);                  //参考一个汇编函数   int x[4]={0x1223,0x345,0x2345,0x3444};                 //定义全局变量并初始化   int s; //定义全局变量   void main()   {   s=sum(x);   while(1);   } //汇编子程序: .global _sum    _sum rptz ac0,#3 add *ar0+,ac0 mov ac0,t0 ret 6.1.2 变量定义及编译模式 1. 变量定义   当C函数和汇编子程序使用同一变量时,在汇编子程序中,这些变量名必须使用.global、.def或.ref定义成全局变量。 2. 编译模式   使用C编译器,在进入汇编程序时,C55x的CPL(编译模式位)自动被置1,相对寻址模式使用堆栈指针SP。如果在汇编程序中需要使用相对直接寻址模式访问数据存储器,则必须改成数据页DP直接寻址模式,这可以通过清CPL位实现。在返回C调用程序前,CPL位必须重新置1。 6.1.3 参数传递及返回值   1. 参数传递   从C函数传递参数到汇编子程序,必须严格遵守C调用转换规则。传递一个参数,C编译器安排它一个特定的数据类型,并把它放到相应数据类型的寄存器里,C55x的C编译器使用以下三种典型的数据类型:   ■数据指针:int *或long *;   ■16位数据:char、short或 int;   ■32位数据:long、float、double或函数入口。   如果参数指向数据内存,则它们作为数据指针;如果参数能放到一个16位的寄存器里,则它作为16位数据,例如数据类型为int和char,否则作为32位数据。参数也可以是结构体,一个结构体是两个字(32位),或少于两个字,将作为32位参数,并使用32位寄存器传递;超过两个字的结构体,使用参考点传递参数,C编译器将使用指针来传递结构体的地址,这个指针作为一数据参数。   在子程序调用中,函数中的参数按一定顺序安排到寄存器中,参数存放寄存器和其数据类型相对应,表6-1所示为参数类型和寄存器安排顺序表。 表6-1 参数类型和寄存器安排顺序表   由表6-1可见,辅助寄存器既可作为数据指针又可以作为16位数据寄存器,例如T0和T1保存了16位数据参数,并且AR0已经保存了一个数据指针参数,那么第三个16位参数数据将放到AR1。   2. 参数返回值   对于被调用的子程序的返回值,不同类型的参数使用的寄存器也有所不同。例如:当返回一个16位数据时使用T0;当返回一个32位数据时使用AC0;当返回一个数据指针时使用XAR0;当返回一个结构体时,这个结构体保存在当前的堆栈里。   3. 应用实例   以下是几个参数传递和返回值使用寄存器的例子。   【例6-1】 返回值存放于T0,参数传递时,16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0。函数定义及使用寄存器关系表示如下:   【例6-2】 返回值存放于AC0,参数传递时,16位数据i使用T0,16位数据指针*k使用AR0,16位数据p使用T1,16位数据n使用AR1。函数定义及使用寄存器关系表示如下:   【例6-3】 返回值存放于AC0,参数传递时,16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0,16位数据n使用T1。函数定义及使用寄存器关系表示如下: 6.1.4 寄存器的使用和保存   当使用一个函数调用时,调用函数和被调用函数之间寄存器

文档评论(0)

yurixiang1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档