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

DSP16   2009-12-29 14:15 楼主
分别用C语言和汇编语言进行程序设计,计算正弦函数值,并比较代码效率。
1C语言编程
#include
#define NX 180
//
最大正弦角度
#define pi 3.14159
short i;
double x[NX]
//
定义输入正弦角度数组(弧度值)
double r[NX]
//
定义输出正弦结果数组
void main(void)
{

for (i=0;i //
将角度转换为弧度

{ x =pi*i/180;


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

}


return;

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

回复评论 (2)

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   分析程序代码长度。
点赞  2009-12-29 14:16

正在学习单片机的路上,小白难入门啊,好资料,学习了,感谢分享!

点赞  2024-10-15 09:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复