快17倍,硬件三角函数,硬件浮点,硬件MDU32,速度测试,STC32F12K54系列
STC32F12K54系列单片机的新增硬件三角函数运算单元 比软件 快 17.1倍
硬件浮点加减乘除开方 比软件 快 6.9倍
硬件32位乘除单元 比软件 快 4.4倍
测试结果如下:(粗体为硬件比软件快的倍数)
硬件 PK 软件
WTST = 0测试频率=28MHzWTST = 1ICACHE OFF测试频率=56MHzWTST = 1ICACHE ON测试频率=56MHz
硬件MDU32 PK 软件32位乘除3.9倍3.5倍4.4倍
硬件浮点 PK 软件浮点5.6倍5.7倍6.9倍
硬件三角函数 PK 软件三角函数11.6倍16.4倍17.1倍
测试代码如下:
#include "stc32g.h"
#include "stdio.h"
#include "math.h"
#define FOSC 56000000UL
#define BAUD (65536 - FOSC/4/115200)
void ICacheOn()
{
bit fEA;
if (WTST > 0) //WTST为0时不需要且不能使能ICACHE
{
fEA = EA; //保存EA
EA = 0; //关闭中断
_nop_();
_nop_();
TA = 0xaa; //写入触发命令序列1
//此处不能有其他任何指令
TA = 0x55; //写入触发命令序列2
//此处不能有其他任何指令
ICHECR = 0x01; //写保护暂时关闭,可以修改ICHECR中的EN位
//EN位再次进入写保护状态
_nop_();
_nop_();
EA = fEA; //恢复EA
}
}
void main(void)
{
unsigned long v;
float f;
bit b;
int i;
ICacheOn();
AUXR = 0x40;
SCON = 0x52;
TMOD = 0x00;
TL1 = BAUD;
TH1 = BAUD >> 8;
TR1 = 1;
printf("Test STC32F12K54 FPMU && MDU32 !\n");
//整数乘除运算
TL0 = 0x00;
TH0 = 0x00;
TR0 = 1;
v = 1;
for (i = 0; i < 10; i++)
{
v *= 2L; //?C?LIMUL
v *= 1234562L; //?C?LMUL
v /= 3; //?C?ULIDIV
v /= 123453; //?C?ULDIV
v = (long)v / 3; //?C?SLDIV
}
TR0 = 0;
printf("MDU32 : %u\n", (TH0 << 8) | TL0);
//浮点运算
TL0 = 0x00;
TH0 = 0x00;
TR0 = 1;
for (i = 0; i < 10; i++)
{
f = 12341.234546;
f += 345462.345678; //?C?FPADD
f = 12341.234546;
f -= 74463.345678; //?C?FPSUB
f = 12341.234546;
f *= 897654.3456788; //?C?FPMUL
f = 12341.234546;
f /= 9876565.232345; //?C?FPDIV
f = 12341.234546;
f = sqrt(f); //sqrt?_
f = 12341.234546;
b = f > 1.0; //?C?FPCMP3
f = 12341.234546;
f = -f; //?C?FPNEG
f = 12341.234546;
f = fabs(f); //fabs?_
}
TR0 = 0;
printf("FPMU : %u\n", (TH0 << 8) | TL0);
//三角函数运算
TL0 = 0x00;
TH0 = 0x00;
TR0 = 1;
for (i = 0; i < 10; i++)
{
f = 12341.234546;
f = sin(f); //sin?_
f = 12341.234546;
f = cos(f); //cos?_
f = 12341.234546;
f = tan(f); //tan?_
f = 12341.234546;
f = atan(f); //atan?_
}
TR0 = 0;
printf("SIN : %u\n", (TH0 << 8) | TL0);
while(1);
}
测试结果如下:(粗体为硬件比软件快的倍数)
硬件 PK 软件
WTST = 0测试频率=28MHzWTST = 1ICACHE OFF测试频率=56MHzWTST = 1ICACHE ON测试频率=56MHz
硬件MDU32 PK 软件32位乘除3.9倍3.5倍4.4倍
硬件浮点 PK 软件浮点5.6倍5.7倍6.9倍
硬件三角函数 PK 软件三角函数11.6倍16.4倍17.1倍
给作者点赞{:4_250:} 有了浮点运算器是不是可以做傅里叶变换了? 每秒可以做多少次浮点乘法,C语言循环的条件下? 测试一下
页:
[1]