DSP

CCS下的C和汇编的混合编程

2019-07-13 18:19发布


CCS是一个完整的DSP集成开发环境。CCS最初由GODSP公司为C6000系列设计,后来TI公司受够了GODSP公司,并将CCS扩展到其他系列,成为一个多平台的集成开发环境。CCS支持C语言、汇编语言、.H文件、.cmd文件。 汇编和C的相互调用可以分为以下几种情况:
  1. 汇编中访问C中的变量和函数
C函数调用汇编子程序时,汇编程序中所有变量名和子函数名前加下划线“_”,例如使用_sum作为汇编语言程序子函数名。同理如果汇编中定义了变量,必须加前缀下划线C函数才能使用该变量。前缀下划线只在C编译时使用,在C函数中使用汇编函数和变量时不需要加前缀下划线。 当C语言和汇编使用统一变量时,在汇编程序中必须使用.global.def.ref定义成全局变量。 在汇编中调用C语言的函数时,如果没有参数传递,直接使用_funcname,如果有参数传递,则使用寄存器来传递相应的参数,如下表(以dspc5509为例)
参数类型 寄存器安排顺序 16位数据指针 AR0 AR1 AR2 AR3 AR4 23位数据指针 XAR0 XAR1 XAR2 XAR3 XAR4 16位数据 T0 T1 AR0 AR1 AR2 AR3 AR4 32位或40位数据 AC0 AC1 AC2
如函数为: intfn(int i1,long l2,int *p3)其参数传递使用寄存器T0AC0AR0传递,函数返回值通过T0传递。
2C程序中访问汇编中的变量 如果需要在C程序中访问汇编中的变量,则汇编程序中的变量名必须以下划线为首字符,并用.global声明为全局变量,如果需要访问汇编中的过程,则过程名必须以下划线为首字符,并且要根据C程序编译时使用的模式是stack-basedmodel还是register argumentmodel类正确的编写该过程,使之能正确的取得调用参数。
  1. 以下为本人试验的例子
以下为本人代码验证,main.cC语言函数,cas.asm为汇编代码。 Main.c #include externint addfunc(int *p);//C语言调用汇编中的过程用extern声明为外部函数 int globla=10;//C中定义的全局变量在汇编中使用用.global声明为全局变量 int subfunc(int a,int b)//汇编中会调用该函数需在汇编中用.global声明为全局函数 { int i=a-b; return i; } void main() { int sum; int loca=15; sum=addfunc(&loca); globla=subfunc(3,1); printf("sum=%d globla=%d",sum,globla); } 汇编部分代码 Cas.asm .global_addfunc;注意此处开头应空一格不然出现synaxerror .global _subfunc;汇编调用C语言中定义的函数 .global_globla _addfunc:;汇编中定义的过程若要被C调用必须加下划线 MOV *AR0,AR1 ADD*(#_globla),AR1,AR1 MOV AR1,T0 MOV #10h,T1 CALL_subfunc;此处使用寄存器T0T1subfunc传递参数,并且通过T0返回结果 RETCCS中新建项目,添加库文件及.cmd文件运行结果为 sum=9 globla=2