笔者最近开始着手学习调试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