测量STC32G的浮点运算时间
为了测量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;
应该优化掉了。
改成 a=a+0.01就好了 本帖最后由 tianxiongweitxw 于 2022-12-15 13:52 编辑
我试试,加法的计算时间和乘除应该不同吧,我就要想测试乘除的计算时间. 确实是被编译器优化了,我把优化等级从7调节到2,就正常了.谢谢叶工.{:smile:} 你代码中是测不出来的,两个数字的运算,直接在编译器里就完成了。只有是变量参与的,才在程序里执行。 a=0.890*0.112,编译器直接给的是 a=0.09968; 你给的是常数,编译器计算好字节赋值了。
你要计算浮点,可以使用如下计算:
a=a*1.01; 本帖最后由 tianxiongweitxw 于 2022-12-15 18:17 编辑
coody 发表于 2022-12-15 15:41
a=0.890*0.112,编译器直接给的是 a=0.09968; 你给的是常数,编译器计算好字节赋值了。
你要计算浮点,可 ...
代码优化取消后,正常了,可能是取消优化,程序就按写的执行1000次吧,我只是猜测,编译原理不太懂. STC32G 测试结果,1000次浮点运算,12MS. 速度比M0 核是不是快。。用多少频率? 用Keil C51都用出制杖了,不懂volatile这个关键字。 tianxiongweitxw 发表于 2022-12-15 18:08
代码优化取消后,正常了,可能是取消优化,程序就按写的执行1000次吧,我只是猜测,编译原理不太懂. ...
即便优化调低,也只是执行了a = 0x9xx,并不会执行数值的乘法。 tianxiongweitxw 发表于 2022-12-15 18:24
STC32G 测试结果,1000次浮点运算,12MS.
12uS 计算一次浮点数乘法。看样子硬件不支持浮点运算。像个M0。
比方MCU时钟30MHZ。 12us 跑360条指令才算好一次浮点乘法,是乌龟,不是拖拉机。 本帖最后由 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条指令。
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条指令。
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; STC这种垃圾也用呀。 liubinghui 发表于 2022-12-16 15:16
STC这种垃圾也用呀。
STC垃圾吗?看来你是不做产品,在能满足性能需求的情况下,价格,供货,稳定性,开发成本,维护成本等都是要考虑的,8位机能满足大部分需求,STC在这方面做得也不错。不是32位就比8位高大上,还是要从实际产品去考虑。 liubinghui 发表于 2022-12-16 15:16
STC这种垃圾也用呀。
你举个你认为不垃圾的片子型号,让我看看觉得垃圾不 ? 刚好我手上也有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);
}
}
coody 发表于 2022-12-16 22:39
刚好我手上也有STC32G12K128,实测速度,1000次浮点乘法3.3ms @30MHz,计算一次(包括循环)3.3us,对于没 ...
带循环不准,
应该这样测:开定时器(1T模式),复制100行fx = fx * 1.01,关定时器,把定时器计数值上传到串口,看跑了多少时钟
页:
[1]
2