|
在开发dsp应用软件的时候,可以选择c语言或者汇编语言。二者各有优缺点:C语言作为比较流行的高级语言,结构简单,可读性强,可移植性好,但是执行效率相对汇编而言比较低。而汇编语言可以将dsp的性能发挥至极限,但是比较难阅读,开发时间较长。所以使用的方法是 先用c语言编写大致的框架,再修改关键部分编译出的汇编代码,或者重新用汇编代码编写,也就是所谓的交叉汇编。我个人认为,必须将两者结合起来,才能写出高效、易懂的程序。下面主要 透过TI2xx以及54xx的交叉汇编来谈一下我的认识 1、寄存器的定义 在c语言中,大家可以通过关键字volatile 来定义相应的寄存器 exa: #define IFR (*(volatile union Ifr *)0x0006) 这样可以在C中定义该寄存器的数据结构并引用 2、变量的声明 交叉汇编语言中,如果利用汇编语言编写部分代码,在定义变量时在 量名前加下划线并用.global声明即可,这样可以在C文件中引用之。 exa: .bss _test,1 .global _test extern unsigned int test; test=123; 意的是,由于dsp按页管理ram,所以需要采用ldpk指令来load data page。所以,在编写汇编语言程序时,尽量将所用的ram独立的放到一个page中,防止ldpk使用频繁浪费时间,以及修改C语言的变量时导致汇编中ram分配情况变掉,程序不能执行。 可以通过修改.cmd文件实现 exa: ………………………… DRAM1 : origin = 00800h , length = 00030h ………………………… .userpage: > DRAM1 PAGE = 1 然后可以使用.usect来定义变量 exa: _Test .usect ".userpage",2 3、C语言中嵌入汇编语言 asm(" instruction ") 在使用这种方法调用汇编语句的时候,首先要注意在"后一定要加空格或tab,否则会当成 label来处理。因为cc只是简单的将这句话加.asm文件中,并不进行很多检查。另外在c中嵌入汇编,注意不能破坏c的编译环境,这个后面再讲 4、c的运行环境 C语言中,会开辟一定的内存区作为堆栈,来保存返回地址和临时变量以及参数。所以在调用函数时,会在开头加上以下代码: POPD *+ ;return adress SAR AR0,*+ ; ar0-->stack SAR AR1,* ; ar1-->stack LARK AR0,4 ; temporary frame LAR AR0,*0+ SAR AR6,*+,AR6 ;save register vars LARK AR6,1 MAR *0+,AR3
在返回的时候会加入以下语句 MAR * ,AR1 <restore register vars> MAR *- LAR AR6,* SBRK 5 LAR AR0,*- PSHD * RET 其中AR1是堆栈指针而AR0是Frame Pointer,AR6则用来保存声明为register类型的变量 AR2用于局部变量寻址,而AR3--5用来表达式分析 所以在编写汇编语言函数的时候,需要加上以上代码,以维持C的编译环境。所以在C语言 中嵌入汇编语言时,要注意这些辅助寄存器的使用,不要轻易修改,另外在汇编语言中调用 c函数之前,一定要把当前辅助寄存器值为AR1。
一些最基本的东西,大家可以从c COMPILER 上找到,希望能给大家带来帮助
|