CCS是一个完整的
DSP集成开发环境。
CCS最初由
GODSP公司为
C6000系列设计,后来
TI公司受够了
GODSP公司,并将
CCS扩展到其他系列,成为一个多平台的集成开发环境。
CCS支持
C语言、汇编语言、
.H文件、
.cmd文件。
汇编和
C的相互调用可以分为以下几种情况:
-
汇编中访问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)其参数传递使用寄存器
T0,
AC0,
AR0传递,函数返回值通过
T0传递。
(
2)
C程序中访问汇编中的变量
如果需要在
C程序中访问汇编中的变量,则汇编程序中的变量名必须以下划线为首字符,并用
.global声明为全局变量,如果需要访问汇编中的过程,则过程名必须以下划线为首字符,并且要根据
C程序编译时使用的模式是
stack-basedmodel还是
register
argumentmodel类正确的编写该过程,使之能正确的取得调用参数。
-
以下为本人试验的例子
以下为本人代码验证,
main.c为
C语言函数,
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;此处使用寄存器T0,T1给subfunc传递参数,并且通过T0返回结果
RET
在
CCS中新建项目,添加库文件及
.cmd文件运行结果为
sum=9
globla=2