问答

汇集网友智慧,解决技术难题

21ic问答首页 - 测试STC32G浮点计算性能

单片机

测试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循环不运行.请高手指点,谢谢.


回答 +关注 5
1574人浏览 4人回答问题 分享 举报
4 个回答
  • a=0.890*0.112,编译器直接给的是 a=0.09968; 你给的是常数,编译器计算好字节赋值了。
    你要计算浮点,可以使用如下计算:
    a=a*1.01;

    刚好我手上也有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);
            }
    }
  • 本帖最后由 无善无恶心之体 于 2022-12-16 15:35 编辑

    把a 定义成   volatile float; 再改    a=0.89*i; 这就能看运算时间了。
  • 0.89*0.112=0.09968
    编译器一算,这是一个常数,再瞧瞧a是什么?是个int?直接给0,完事。
  • 编译器一看,这么明显没用的代码要他作甚!
    直接就给优化掉了。

您需要登录后才可以回复 登录 | 注册