首页 > 评测 > 极海E103 FPU浮点运算性能简单测试

极海E103 FPU浮点运算性能简单测试

  
  • 作者:
  • 来源:
  • [导读]
  • #申请原创# #技术资源# 查看规格书发现,APM32E103系列除了可以兼容STM32F103系列外,还增加了一些外设功能。比如FPU、CAN2、外扩SDRAM等。 其中FPU(浮点运算单元)一般是在M4内核的芯片上才有的,可以大大提升浮
#申请原创# #技术资源#
查看规格书发现,APM32E103系列除了可以兼容STM32F103系列外,还增加了一些外设功能。比如FPU、CAN2、外扩SDRAM等。
其中FPU(浮点运算单元)一般是在M4内核的芯片上才有的,可以大大提升浮点数的运算效率。
查看手册和SDK发现,APM32E103的FPU使用上是与M4内核自带的FPU有区别的,需要像使用外设一样开启时钟,调用封装好的库函数。
FPU库的sc_math.h中声明了能使用的浮点运算函数。

C语言中进行浮点运算,可以调用math.h来进行浮点计算。
接下来就简单对比测试下APM32E103的FPU与math.h中进行同样的sin()和cos运算,看计算时间分别是多少。

计算思路就是通过先清零TMR5计数值,读进行100次浮点运算前后的计数值来计算所用时间。
  1. void TMR5_Init(void)
  2. {
  3.     TMR_BaseConfig_T TMR_BaseConfigStruct;

  4.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);

  5.     TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;
  6.     TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;
  7.     TMR_BaseConfigStruct.division = 7;
  8.     TMR_BaseConfigStruct.period = 0xFFFF;
  9.     TMR_BaseConfigStruct.repetitionCounter = 0;
  10.     TMR_ConfigTimeBase(TMR5, &TMR_BaseConfigStruct);


  11.     TMR_Enable(TMR5);
  12. }
复制代码
  1. int main(void)
  2. {
  3.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_FPU);
  4.     RCM->CFG |= BIT27;

  5.                 TMR5_Init();
  6.                 Usart_Init();
  7.                
  8.                 a=10*PI/180;
  9.                
  10.                 printf("Angle=%5.11f\r\n",a);
  11.                
  12.                 TMR_ConfigCounter(TMR5,0);
  13.                
  14.                 m=TMR_ReadCounter(TMR5);
  15.                                 for (s = 0; s < 100; s++)
  16.                         {
  17.                                 ans[0] = sc_math_sin(a);//FPU sin()
  18.                         }
  19.                 n=TMR_ReadCounter(TMR5);
  20.                 printf("\r\nAPM32 FPU SIN(): %5.11f\r\n", ans[0]);
  21.                 printf("Time:%d\r\n",(n-m));


  22.                         TMR_ConfigCounter(TMR5,0);
  23.                         m=TMR_ReadCounter(TMR5);
  24.                                                 for (s = 0; s < 100; s++)
  25.                         {
  26.                                 ans[1] = sin(a);//math.h SIN()
  27.                         }
  28.                         n=TMR_ReadCounter(TMR5);
  29.                         printf("\r\nC math.h SIN(): %5.11f\r\n", ans[1]);
  30.                         printf("Time:%d\r\n",(n-m));
  31.                        
  32.                 TMR_ConfigCounter(TMR5,0);
  33.                 m=TMR_ReadCounter(TMR5);
  34.                                 for (s = 0; s < 100; s++)
  35.                         {
  36.                                 ans[0] = sc_math_cos(a);//FPU cos()
  37.                         }
  38.                                 n=TMR_ReadCounter(TMR5);
  39.                         printf("\r\nAPM32 FPU COS(): %5.11f\r\n", ans[0]);
  40.                                 printf("Time:%d\r\n",(n-m));


  41.                         TMR_ConfigCounter(TMR5,0);
  42.                         m=TMR_ReadCounter(TMR5);
  43.                                                 for (s = 0; s < 100; s++)
  44.                         {
  45.                 ans[1] = cos(a);//math.h cos()
  46.                         }
  47.                                                 n=TMR_ReadCounter(TMR5);
  48.                         printf("\r\nC math.h COS(): %5.11f\r\n", ans[1]);
  49.                         printf("Time:%d\r\n",(n-m));
  50.                        
  51.                        
  52. }
复制代码
使用串口就能打印输出浮点运算值和所用时间。
输入角度为10°时的结果。

输入角度为120°的结果:

从计算结果来对比看,浮点运算值都还是比较准确的。
APM32E103的FPU对计算效率的提升还是很明显的,目前由于是硬件完成计算,不同的输入值对运算时间基本没有影响。
而使用math.h的sin()和cos()需要转换运算,不同输入值的计算时间都不一样。
整体而言APM32E103的FPU对支持的浮点运算函数,运算的效率和准确性还是很不错的,有比较多浮点运算的场合还是比较合适的。
  • 本文系21ic原创,未经许可禁止转载!

网友评论