首页 > 评测 > 亚星娱乐官网app下载中心 极海E103 FPU浮点运算性能简单测试

亚星娱乐官网app下载中心 极海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.                 a=10*PI/180;

  8.                 printf("Angle=%5.11f\r\n",a);

  9.                 TMR_ConfigCounter(TMR5,0);

  10.                 m=TMR_ReadCounter(TMR5);
  11.                                 for (s = 0; s <100; s++)
  12.                         {
  13.                                 ans[0] = sc_math_sin(a);//FPU sin()
  14.                         }
  15.                 n=TMR_ReadCounter(TMR5);
  16.                 printf("\r\nAPM32 FPU SIN(): %5.11f\r\n", ans[0]);
  17.                 printf("Time:%d\r\n",(n-m));


  18.                         TMR_ConfigCounter(TMR5,0);
  19.                         m=TMR_ReadCounter(TMR5);
  20.                                                 for (s = 0; s <100; s++)
  21.                         {
  22.                                 ans[1] = sin(a);//math.h SIN()
  23.                         }
  24.                         n=TMR_ReadCounter(TMR5);
  25.                         printf("\r\nC math.h SIN(): %5.11f\r\n", ans[1]);
  26.                         printf("Time:%d\r\n",(n-m));

  27.                 TMR_ConfigCounter(TMR5,0);
  28.                 m=TMR_ReadCounter(TMR5);
  29.                                 for (s = 0; s <100; s++)
  30.                         {
  31.                                 ans[0] = sc_math_cos(a);//FPU cos()
  32.                         }
  33.                                 n=TMR_ReadCounter(TMR5);
  34.                         printf("\r\nAPM32 FPU COS(): %5.11f\r\n", ans[0]);
  35.                                 printf("Time:%d\r\n",(n-m));


  36.                         TMR_ConfigCounter(TMR5,0);
  37.                         m=TMR_ReadCounter(TMR5);
  38.                                                 for (s = 0; s <100; s++)
  39.                         {
  40.                 ans[1] = cos(a);//math.h cos()
  41.                         }
  42.                                                 n=TMR_ReadCounter(TMR5);
  43.                         printf("\r\nC math.h COS(): %5.11f\r\n", ans[1]);
  44.                         printf("Time:%d\r\n",(n-m));


  45. }
复制代码
使用串口就能打印输出浮点运算值和所用时间。
输入角度为10°时的结果。

输入角度为120°的结果:

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

亚星娱乐官网app下载中心