zhp 发表于 2023-6-29 15:48:22

快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倍








2623724652@qq 发表于 2023-7-25 11:11:22

给作者点赞{:4_250:}

qizhiguang 发表于 2023-8-1 09:04:21

有了浮点运算器是不是可以做傅里叶变换了?

13918210822 发表于 2023-8-8 07:48:13

每秒可以做多少次浮点乘法,C语言循环的条件下?

LAOXU 发表于 2023-9-3 16:59:42

测试一下
页: [1]
查看完整版本: 快17倍,硬件三角函数,硬件浮点,硬件MDU32,速度测试,STC32F12K54系列