分别用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 。
利用CCS图形工具可以观察这段数据的波形。注意CCS图像显示参数设置中,正确填入数据的起始地址,数据长度设为180,数据类型要设为32位浮点数。
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 分析程序代码长度。
正在学习单片机的路上,小白难入门啊,好资料,学习了,感谢分享!