打印
[电子元器件]

测量STC32G的浮点运算时间

[复制链接]
2113|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianxiongweitxw|  楼主 | 2022-12-15 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       为了测量STC32G的浮点运算时间,我设计下面的程序,1000次浮点运算后,管脚P24置0,计算前置1.通过示波器观察P24为1 的时间,从而算出1000次浮点的运行时间.
现在的问题:FOR循环不执行,换成延时程序,观察结果正常.我想不明白FOR循环为什么不执行,请大佬帮忙看看,谢谢!
                    u16 i=0;
                    P24=1;
                 // delay_ms(10);
                   for(i=0; i<1000; i++)  //测量浮点运算时间
                   {
                           a=0.890*0.112;
                         }
                   P24=0;

使用特权

评论回复
沙发
叶春勇| | 2022-12-15 13:09 | 只看该作者
应该优化掉了。
改成 a=a+0.01就好了

使用特权

评论回复
板凳
tianxiongweitxw|  楼主 | 2022-12-15 13:50 | 只看该作者
本帖最后由 tianxiongweitxw 于 2022-12-15 13:52 编辑

我试试,加法的计算时间和乘除应该不同吧,我就要想测试乘除的计算时间.

使用特权

评论回复
地板
tianxiongweitxw|  楼主 | 2022-12-15 14:20 | 只看该作者
确实是被编译器优化了,我把优化等级从7调节到2,就正常了.谢谢叶工.

使用特权

评论回复
5
gaoyang9992006| | 2022-12-15 15:12 | 只看该作者
你代码中是测不出来的,两个数字的运算,直接在编译器里就完成了。只有是变量参与的,才在程序里执行。

使用特权

评论回复
6
coody| | 2022-12-15 15:41 | 只看该作者
  a=0.890*0.112,编译器直接给的是 a=0.09968; 你给的是常数,编译器计算好字节赋值了。
你要计算浮点,可以使用如下计算:
a=a*1.01;

使用特权

评论回复
7
tianxiongweitxw|  楼主 | 2022-12-15 18:08 | 只看该作者
本帖最后由 tianxiongweitxw 于 2022-12-15 18:17 编辑
coody 发表于 2022-12-15 15:41
a=0.890*0.112,编译器直接给的是 a=0.09968; 你给的是常数,编译器计算好字节赋值了。
你要计算浮点,可 ...

代码优化取消后,正常了,可能是取消优化,程序就按写的执行1000次吧,我只是猜测,编译原理不太懂.

使用特权

评论回复
8
tianxiongweitxw|  楼主 | 2022-12-15 18:24 | 只看该作者
STC32G 测试结果,1000次浮点运算,12MS.

使用特权

评论回复
9
li357919| | 2022-12-16 08:36 | 只看该作者
速度比M0 核是不是快。。用多少频率?

使用特权

评论回复
10
R2D2| | 2022-12-16 09:02 | 只看该作者
用Keil C51都用出制杖了,不懂volatile这个关键字。

使用特权

评论回复
11
aple0807| | 2022-12-16 09:37 | 只看该作者
tianxiongweitxw 发表于 2022-12-15 18:08
代码优化取消后,正常了,可能是取消优化,程序就按写的执行1000次吧,我只是猜测,编译原理不太懂. ...

即便优化调低,也只是执行了a = 0x9xx,并不会执行数值的乘法。

使用特权

评论回复
12
xch| | 2022-12-16 12:09 | 只看该作者
tianxiongweitxw 发表于 2022-12-15 18:24
STC32G 测试结果,1000次浮点运算,12MS.

12uS 计算一次浮点数乘法。看样子硬件不支持浮点运算。像个M0。

比方MCU时钟30MHZ。 12us 跑360条指令才算好一次浮点乘法,是乌龟,不是拖拉机。

使用特权

评论回复
13
xch| | 2022-12-16 12:39 | 只看该作者
本帖最后由 xch 于 2022-12-16 12:43 编辑

uint32_t CntComputing=0;
extern TIM_TypeDef *TSLAVE;
void ComputingTestDemo(float inp)
{
  CntComputing = TSLAVE->CNT;
  float x =inp;
  for (uint16_t i=0;i<1000;i++)
  {
    x= sqrtf(1.0+x);
  }
  
  CntComputing = TSLAVE->CNT - CntComputing;
  TSLAVE->CNT  = (uint32_t)x;
  asm("nop");
}

我使用跑在160MHZ主频的 M4 mcu ,用32位定时器计数测量计算时间,开平方1000次, 使用了 37.5uS。
相当于每次开方计算大约跑了 6条指令。

使用特权

评论回复
评论
xch 2022-12-19 10:21 回复TA
@coody :关闭FPU 后,实测运算1000次使用398.25uS ,相当于每次运算 用了67.3条指令。 差不多慢了十倍 
xch 2022-12-17 12:39 回复TA
@coody :M3 也没用过。现在只用M4,M33,M7 
coody 2022-12-17 11:14 回复TA
@xch :你用M3也可以测试的,M3不带硬件浮点。 
xch 2022-12-17 09:36 回复TA
@coody :下周我将FPU 关闭,重新编译测试。我不用M0好几年了,没有M0的板子 
coody 2022-12-16 22:04 回复TA
M4带硬件浮点的当然快了,你用STM32F051试试? 
14
xch| | 2022-12-16 12:46 | 只看该作者
uint32_t CntComputing=0;
extern TIM_TypeDef *TSLAVE;
void ComputingTestDemo(float inp)
{
  CntComputing = TSLAVE->CNT;
  double x =inp;
  for (uint16_t i=0;i<1000;i++)
  {
    x= sqrt(1.0+x);
  }
  
  CntComputing = TSLAVE->CNT - CntComputing;
  TSLAVE->CNT  = (uint32_t)x;
  asm("nop");
}

改成双精度运算后,计算时间急剧加长到1205.75us;
因为,硬件不支持了双精度,平均每次运算开方花了193条指令。

使用特权

评论回复
15
xch| | 2022-12-16 12:56 | 只看该作者
uint32_t CntComputing=0;
extern TIM_TypeDef *TSLAVE;
void ComputingTestDemo(float inp)
{
  CntComputing = TSLAVE->CNT;
  double x =inp;
  do
  {
    x= sqrt(1.0+x);
  }while(  x !=sqrt(1.0+x) );
  
  CntComputing = TSLAVE->CNT - CntComputing;
  TSLAVE->CNT  = (uint32_t)x;
  asm("nop");
}

跑这段数学题,花了75.75us,得出 当 x = 1.6180339887498949 时,x =1+ ✓x;

使用特权

评论回复
16
liubinghui| | 2022-12-16 15:16 | 只看该作者
           STC这种垃圾也用呀。

使用特权

评论回复
评论
tianxiongweitxw 2022-12-21 16:55 回复TA
我用STC做的产品有几千个了,没有问题。不是垃圾。不要带有心眼镜看。 
17
sdwys| | 2022-12-16 15:56 | 只看该作者
liubinghui 发表于 2022-12-16 15:16
STC这种垃圾也用呀。

STC垃圾吗?看来你是不做产品,在能满足性能需求的情况下,价格,供货,稳定性,开发成本,维护成本等都是要考虑的,8位机能满足大部分需求,STC在这方面做得也不错。不是32位就比8位高大上,还是要从实际产品去考虑。

使用特权

评论回复
评论
dog_xin 2022-12-16 21:22 回复TA
以最小的成本完成应用是最高的设计 
18
coody| | 2022-12-16 22:07 | 只看该作者
liubinghui 发表于 2022-12-16 15:16
STC这种垃圾也用呀。

你举个你认为不垃圾的片子型号,让我看看觉得垃圾不 ?  

使用特权

评论回复
19
coody| | 2022-12-16 22:39 | 只看该作者
刚好我手上也有STC32G12K128,实测速度,1000次浮点乘法3.3ms @30MHz,计算一次(包括循环)3.3us,对于没有硬件浮点运算的MCU来说,这个速度我觉得很不错了。

#define  MAIN_Fosc   30000000L        //定义主时钟

#include        "STC32G.h"

void  delay_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);
        }
}

使用特权

评论回复
20
changle11sdo5| | 2022-12-17 13:51 | 只看该作者
coody 发表于 2022-12-16 22:39
刚好我手上也有STC32G12K128,实测速度,1000次浮点乘法3.3ms @30MHz,计算一次(包括循环)3.3us,对于没 ...

带循环不准,
应该这样测:开定时器(1T模式),复制100行fx = fx * 1.01,关定时器,把定时器计数值上传到串口,看跑了多少时钟

使用特权

评论回复
评论
tianxiongweitxw 2022-12-21 16:54 回复TA
只是测个大概,让自己心里有数,所以误差一点也没有所谓。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

520

帖子

0

粉丝