tianxiongweitxw 发表于 2022-12-15 00:22

测试STC32G浮点计算性能

本帖最后由 tianxiongweitxw 于 2022-12-15 13:11 编辑

为了测试STC32G的浮点运算性能,设计了下面一段代码:                                                   u16 i=0;
                  P24=1;            
                // delay_ms(10);
                   for(i=0; i<1000; i++)//测量浮点运算时间
                        {
                           a=0.890*0.112;
                         }
                   P24=0;


以上代码用管脚P24的高电平,显示单片机做一千次浮点运算的时间,用示波器观察.问题来了,示波器没有反应,好像这个FOR循环没有运行,把FOR循环换成延时函数,可以正常;思来想去,也不明白那里出了问题,为什么FOR循环不运行.请高手指点,谢谢.


fzyuan 发表于 2022-12-16 12:13

编译器一看,这么明显没用的代码要他作甚!
直接就给优化掉了。

tianxj01 发表于 2022-12-16 12:26

0.89*0.112=0.09968
编译器一算,这是一个常数,再瞧瞧a是什么?是个int?直接给0,完事。

无善无恶心之体 发表于 2022-12-16 15:32

本帖最后由 无善无恶心之体 于 2022-12-16 15:35 编辑

把a 定义成   volatile float; 再改    a=0.89*i; 这就能看运算时间了。

coody 发表于 2022-12-17 11:26

a=0.890*0.112,编译器直接给的是 a=0.09968; 你给的是常数,编译器计算好字节赋值了。
你要计算浮点,可以使用如下计算:
a=a*1.01;

刚好我手上也有STC32G12K128,实测速度,1000次浮点乘法3.3ms @30MHz,计算一次(包括循环)3.3us,对于没有硬件浮点运算的MCU来说,这个速度我觉得很不错了。

#defineMAIN_Fosc   30000000L      //定义主时钟

#include      "STC32G.h"

voiddelay_ms(u16 ms)
{
   u16 i;
         do
         {
               i = MAIN_Fosc / 6000;
                while(--i)      ;
   }while(--ms);
}

float      edata fx;

void main(void)
{
      u16      i;

      WTST = 0;
      CKCON = 0;
      P0M1 = 0;
      P0M0 = 0;

      while (1)
      {
                P00 = 1;   // 3.3ms @30MHz
                for(fx=1.0f, i=0; i<1000; i++)
                {
                        fx = fx * 1.01;
                }
                P00 = 0;
                delay_ms(1);
      }
}
页: [1]
查看完整版本: 测试STC32G浮点计算性能