带fpu的ARM进行浮点运算和定点运算速度对比

笔者最近开始着手学习调试FOC电机控制,硬件选型优先考虑国产ARM的片子,考虑到公司现有产品多使用ti-28034平台,高频任务采用ti的iqmath库,移植ARM平台准备将现有的iqmath库运算直接改写浮点运算,方便维护,考虑当前MCU选型主频并不是很高,有必要对FPU的运算能力有个大致掌握。

测试平台:国民技术N32L406CBL7开发板,108M主频,ARM架构M4核心内置FPU运算器
测试内容:对整形、单精度、双精度、iqmath四种类型数据的乘法和除法运算

测试平台


1700127779971.png

整点乘法运算

    int32_t i = 0;
    uint8_t flag;
    
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            int val = 987654321 * 123456789;
        }
        
        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果653us


1700128755836.png

整点除法运算

    int32_t i = 0;
    uint8_t flag;
    
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            int val = 987654321 / 123456789;
        }

        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果 553us


1700130384679.png

单精度乘法运算

    int32_t i = 0;
    uint8_t flag;
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            float val = 0.999999f * 1.999999f;
        }
        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果1.142ms


1700126741129.png

单精度除法运算

    int32_t i = 0;
    uint8_t flag;
    
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            float val = 0.999999f / 1.999999f;
        }
        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果1.142ms


1700128911027.png

双精度乘法运算

    int32_t i = 0;
    uint8_t flag;
    
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            double val = 0.999999 * 1.999999;
        }
        
        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果1.383ms


1700127114733.png

双精度除法

    int32_t i = 0;
    uint8_t flag;
    
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            double val = 0.999999 / 1.999999;
        }

        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果1.392ms


1700130103204.png

iqmath乘法运算

    int32_t i = 0;
    uint8_t flag;
    _iq par1 = _IQ(0.999999f);
    _iq par2 = _IQ(1.999999f);
    
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            _iq val = _IQmpy(par1, par2);
        }
        
        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果1.573ms


1700128233435.png

iqmath除法运算

    int32_t i = 0;
    uint8_t flag;
    _iq par1 = _IQ(0.999999f);
    _iq par2 = _IQ(1.999999f);
    while(1)
    {
        for(i = 0; i < 10000; i++)
        {
            _iq val = _IQdiv(par1, par2);
        }
        
        if(flag)
        {
            gpio_bit_set(GPIOB, GPIO_PIN_11);
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_11);
        }
        flag = !flag;
    }

测试结果10.52ms


1700133556740.png

测试结果如下,让人大跌眼镜:


image.png

实际测试MCU运算能力
NOP() 执行时间0.01us

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容