帶fpu的ARM進(jìn)行浮點(diǎn)運(yùn)算和定點(diǎn)運(yùn)算速度對(duì)比

筆者最近開(kāi)始著手學(xué)習(xí)調(diào)試FOC電機(jī)控制,硬件選型優(yōu)先考慮國(guó)產(chǎn)ARM的片子,考慮到公司現(xiàn)有產(chǎn)品多使用ti-28034平臺(tái),高頻任務(wù)采用ti的iqmath庫(kù),移植ARM平臺(tái)準(zhǔn)備將現(xiàn)有的iqmath庫(kù)運(yùn)算直接改寫(xiě)浮點(diǎn)運(yùn)算,方便維護(hù),考慮當(dāng)前MCU選型主頻并不是很高,有必要對(duì)FPU的運(yùn)算能力有個(gè)大致掌握。

測(cè)試平臺(tái):國(guó)民技術(shù)N32L406CBL7開(kāi)發(fā)板,108M主頻,ARM架構(gòu)M4核心內(nèi)置FPU運(yùn)算器
測(cè)試內(nèi)容:對(duì)整形、單精度、雙精度、iqmath四種類(lèi)型數(shù)據(jù)的乘法和除法運(yùn)算

測(cè)試平臺(tái)


1700127779971.png

整點(diǎn)乘法運(yùn)算

    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;
    }

測(cè)試結(jié)果653us


1700128755836.png

整點(diǎn)除法運(yùn)算

    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;
    }

測(cè)試結(jié)果 553us


1700130384679.png

單精度乘法運(yùn)算

    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;
    }

測(cè)試結(jié)果1.142ms


1700126741129.png

單精度除法運(yùn)算

    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;
    }

測(cè)試結(jié)果1.142ms


1700128911027.png

雙精度乘法運(yùn)算

    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;
    }

測(cè)試結(jié)果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;
    }

測(cè)試結(jié)果1.392ms


1700130103204.png

iqmath乘法運(yùn)算

    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;
    }

測(cè)試結(jié)果1.573ms


1700128233435.png

iqmath除法運(yùn)算

    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;
    }

測(cè)試結(jié)果10.52ms


1700133556740.png

測(cè)試結(jié)果如下,讓人大跌眼鏡:


image.png

實(shí)際測(cè)試MCU運(yùn)算能力
NOP() 執(zhí)行時(shí)間0.01us

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容