ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32 F407 带FPU float Q5.10 运算时间对比

2020-12-18 23:01:44  阅读:408  来源: 互联网

标签:STM32 Q5 lc la float FPU fa fc lb


最近在鼓捣FOC 就是那个无刷驱动

用STM32F407+DRV8305的方案

一开始自己写FOC的时候全用的float来计算,后来遇到一点(亿点点)问题,便在网上借鉴别(^C + ^V)人的代码,发现有人使用了定点数来运算,便好奇两种方式速度能差多少,就做了下对比(本来我以为定点可以秒杀浮点 哪怕有FPU)

平台:STM32F407 开FPU
freertos系统滴答频率是1000HZ,所以1tick就是1ms
keil关闭代码优化(开了也一样)

首先自己定义了Q5.10 的数据结构(我试了试Q10.21结果也是一样):

typedef int16_t Q5_10;
#define ToQ5_10(X) (X) * 1024         // 小数转浮点数
#define Q5_10M(X, Y) (X) * (Y) / 1024 // Q5.10乘法
#define Q5_10D(X, Y) (X) * 1024 / (Y) // Q5.10除法
#define Q5_10TOF(X) (X) / 1024.0f     // Q5.10转float

时间差计算函数:

uint32_t dt;
void tStart(void)
{
    dt = xTaskGetTickCount();
}

uint32_t tStop(void)
{
	//已经移植了Freertos 懒得重新建一个裸机工程 见谅
    return xTaskGetTickCount() - dt; 
}

__IO 来代替 volatile 关键字 (别问 问就是懒),定义所需变量

    __IO Q5_10 la = ToQ5_10(4.8), lb = ToQ5_10(4.0), lc = 0;
    __IO float fa = 4.8f, fb = 4.0f, fc;

以下测试均为10行语句循环0XFFFFF次
乘法对比测试函数:

    tStart();
    for (int i = 0; i < 0XFFFFF; i++)
    {
        lc = Q5_10M(la, lb);
        lc = Q5_10M(la, lb);

        lc = Q5_10M(la, lb);
        lc = Q5_10M(la, lb);

        lc = Q5_10M(la, lb);
        lc = Q5_10M(la, lb);

        lc = Q5_10M(la, lb);
        lc = Q5_10M(la, lb);

        lc = Q5_10M(la, lb);
        lc = Q5_10M(la, lb);
    }
    t = tStop();
    printf("Q *:%05d [%f]\n", t, Q5_10TOF(lc));

    tStart();
    for (int i = 0; i < 0XFFFFF; i++)
    {
        fc = fa * fb;
        fc = fa * fb;

        fc = fa * fb;
        fc = fa * fb;

        fc = fa * fb;
        fc = fa * fb;

        fc = fa * fb;
        fc = fa * fb;

        fc = fa * fb;
        fc = fa * fb;
    }
    t = tStop();
    printf("F *:%05d [%f]\n", t, fc);

除法测试对比函数:

 	tStart();
    for (int i = 0; i < 0XFFFFF; i++)
    {
        lc = Q5_10D(la, lb);
        lc = Q5_10D(la, lb);

        lc = Q5_10D(la, lb);
        lc = Q5_10D(la, lb);

        lc = Q5_10D(la, lb);
        lc = Q5_10D(la, lb);

        lc = Q5_10D(la, lb);
        lc = Q5_10D(la, lb);

        lc = Q5_10D(la, lb);
        lc = Q5_10D(la, lb);
    }
    t = tStop();
    printf("Q /:%05d [%f]\n", t, Q5_10TOF(lc));

    tStart();
    for (int i = 0; i < 0XFFFFF; i++)
    {
        fc = fa / fb;
        fc = fa / fb;

        fc = fa / fb;
        fc = fa / fb;

        fc = fa / fb;
        fc = fa / fb;

        fc = fa / fb;
        fc = fa / fb;

        fc = fa / fb;
        fc = fa / fb;
    }
    t = tStop();
    printf("F /:%05d [%f]\n", t, fc);

最后的结果如下:

Q *:00663 [19.199219]
F *:00532 [19.200001]
Q /:00970 [1.199219]
F /:01408 [1.200000]
数据格式运算类型所用时间 (MS)结果
Q*00663[19.199219]
F*00532[19.200001]
Q/00970[1.199219]
F/01408[1.200000]

结果非常的啊没劲啊
可以看见
浮点乘法居然比定点乘法还要快!!(124.62%)

(当然我知道此处定点乘法其实是一次乘法和一次除法,但是实际情况不也得这样算吗?)

但是浮点除法比定点除法慢了不少(68.89%)

从此次实验还可观察出 能用乘法就别用除法 这种优化思路

以上便是这次无心的发现,令我十分惊奇,如果有什么错误的地方还请大佬们指出!!感谢

标签:STM32,Q5,lc,la,float,FPU,fa,fc,lb
来源: https://blog.csdn.net/qq_23484919/article/details/111397412

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有