DSP16 发表于 2009-12-29 14:15

DSP的C语言心得记录8-利用CCS分析DSP的时钟运行周期

分别用C语言和汇编语言进行程序设计,计算正弦函数值,并比较代码效率。
1)C语言编程
#include <math.h>
#define NX 180
//最大正弦角度
#define pi 3.14159
short i;
double x
//定义输入正弦角度数组(弧度值)
double r
//定义输出正弦结果数组
void main(void)
{

for (i=0;i<NX;i++)
//将角度转换为弧度

{ x =pi*i/180;


r=sin(x);
//计算正弦值

}

return;
}
    程序编译连接通过后,加载生成的.out文件,点击“Run”图标运行程序。我们在“Watch”窗口中可以观察输出的正弦值数组r 。
利用CCS图形工具可以观察这段数据的波形。注意CCS图像显示参数设置中,正确填入数据的起始地址,数据长度设为180,数据类型要设为32位浮点数。

DSP16 发表于 2009-12-29 14:16

2)汇编语言编程

   用汇编语言计算正弦值,一般采用泰勒级数展开的方法。角度正弦值的泰勒级数展开式如下:(见图3)








其中:x为弧度值。

注意:

l       x从0~1,原因是CPU寄存器ST1中的FRCT位为1,CPU处于小数模式。

l       程序文件中所有标号左对齐。

l       编译器默认的程序起始标号_c_int00。


3)汇编程序如下:

   .mmregs             ;伪指令,定义C54x寄存器符号            

   .def    _c_int00   ;伪指令,声明在当前模块中定义的标号

   .def    sin_start         

;;;;;;;;;;;;;;;;;"coeff"段开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

d_coff      .sect   "coeff"      

               .word   01c7h            ;1/72 *(215-1)    Q15格式

               .word   030bh            ;1/42 *(215-1)

               .word   0666h            ;1/20 *(215-1)

               .word   1556h            ;1/6 *(215-1)

;;;;;;;;; 预留中间运算结果存储空间段;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

d_x       .usect “sin_vars”,1   

   ;伪指令,在 "sin_vars"段中预留1个字的空间

d_squr_x .usect "sin_vars",1

d_temp    .usect "sin_vars",1

d_sinx    .usect "sin_vars",1

C_1       .usect "sin_vars",1

;;;;;;;;;;;.text段开始;;;;;;;;;;;;;;;;;;;;;;;;;;;

               .text

_c_int00:      CALL sin_start

sin_start:      

               SSBX    FRCT                  ; ST1中的FRCT位置1

               STM      #d_coff,AR3

                  STM   #d_x,AR2   

                  STM   #C_1,AR4   

                  LD      #d_x, DP

                  ST      #06487h,d_x      ; input x = PI/4

                  ST      #7fffh,C_1

   SQUR    *AR2+,A                            ; A = x^2

   ST         A,*AR2                           ; AR2 = x^2

   || LD       *AR4,B                              ; B = C_1

   MASR    *AR2+,*AR3+,B,A         ; A = (1-x^2/72), T = x^2

   MPYA    A                                        ; A = T*A = x^2*(1-x^2/72)

   STH      A,*AR2                              ; d_temp = A = x^2*(1-x^2/72)

   MASR    *AR2-,*AR3+,B,A            ; A = 1-x^2/42(1-x^2/72),

                                                               ; T = x^2(1-x^2/72)

   MPYA    *AR2+                               ; B = x^2*(1-x^2/42(1-x^2/72))

   ST         B,*AR2            

   || LD       *AR4,B

   MASR    *AR2-,*AR3+,B,A          ; A = 1-x^2/20(1-x^2/42(1-x^2/72)

   MPYA    *AR2+                     ; B = x^2*(1-x^2/20(1-x^2/42(1-x^2/72))

   MASR    *AR2-,*AR3+,B,A   ; A = 1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))

   MPYA    d_x                   ; B = x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))

   STH      B, d_sinx                   ; d_sinx = sin(x)

   RET

    .end

;;;;;;;;;;;;;;;;;.text段结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

4)算法分析

l       运算速度:CCS主界面选择

Profile->Enable Clock,启动时钟分析                         Profile->View Clock,观察分析结果


C语言执行时间(见图4)



汇编语言执行时间(见图5)



l       代码长度:Profile->Start New Sessions

   输入name_profile ,--〉Range   分析程序代码长度。

zshasd1948 发表于 2024-10-15 09:06

页: [1]
查看完整版本: DSP的C语言心得记录8-利用CCS分析DSP的时钟运行周期