筆者最近開(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)

整點(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

整點(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

單精度乘法運(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

單精度除法運(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

雙精度乘法運(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

雙精度除法
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

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

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

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

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