DSP的C语言心得记录-利用CCS分析DSP的时钟运行周期
[复制链接]
分别用C 语言和汇编语言进行程序设计,计算正弦函数值,并比较代码效率。
1 )C 语言编程
#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 。(见图1)
利用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
分析程序代码长度。
(见图6、7)