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

[复制链接]
15948|20
 楼主| Alden 发表于 2023-6-13 15:09 | 显示全部楼层 |阅读模式
#申请原创# #技术资源#
查看规格书发现,APM32E103系列除了可以兼容STM32F103系列外,还增加了一些外设功能。比如FPU、CAN2、外扩SDRAM等。
其中FPU(浮点运算单元)一般是在M4内核的芯片上才有的,可以大大提升浮点数的运算效率。
查看手册和SDK发现,APM32E103的FPU使用上是与M4内核自带的FPU有区别的,需要像使用外设一样开启时钟,调用封装好的库函数。
FPU库的sc_math.h中声明了能使用的浮点运算函数。
fc6d41c9d7dc3057017b9e3e442c066.png
C语言中进行浮点运算,可以调用math.h来进行浮点计算。
接下来就简单对比测试下APM32E103的FPU与math.h中进行同样的sin()和cos运算,看计算时间分别是多少。
4e3c68724dd4ad66e6d88373f8af81c.png
计算思路就是通过先清零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°时的结果。
fe4839a5700c39b69c9677d3774e293.png
输入角度为120°的结果:
5787f2edadbaadff86fba1f9b46582c.png
从计算结果来对比看,浮点运算值都还是比较准确的。
APM32E103的FPU对计算效率的提升还是很明显的,目前由于是硬件完成计算,不同的输入值对运算时间基本没有影响。
而使用math.h的sin()和cos()需要转换运算,不同输入值的计算时间都不一样。
整体而言APM32E103的FPU对支持的浮点运算函数,运算的效率和准确性还是很不错的,有比较多浮点运算的场合还是比较合适的。
 楼主| Alden 发表于 2023-6-13 15:11 | 显示全部楼层

评论

halo大佬,咱们原创要求800字哦,您这篇还差点,可以填充下内容到800左右即可哈  发表于 2023-6-15 14:46
joengchao 发表于 2023-6-13 17:29 | 显示全部楼层
学习了
cauhorse 发表于 2023-6-14 10:46 | 显示全部楼层
FPU和C函数计算值,小数后几位不一样是什么原因呢?
 楼主| Alden 发表于 2023-6-14 15:25 | 显示全部楼层
cauhorse 发表于 2023-6-14 10:46
FPU和C函数计算值,小数后几位不一样是什么原因呢?

毕竟能储存的精度有限,算法不一样精度损失不同,结果就不同
kai迪皮 发表于 2023-6-14 16:28 | 显示全部楼层
好贴点赞

评论

没错  发表于 2023-6-15 14:15
byeyear 发表于 2023-6-15 14:59 | 显示全部楼层
计算结果不一样可能是因为math.h里的sin函数接受double参数并返回double结果。可以用sinf函数试试。
大部分数学函数都有double和float两个版本,默认是double版本,需要float版本的话在函数名后面加个f。
例如sin/sinf, cos/cosf, log/logf,等等。
lxc88998899 发表于 2023-6-15 16:20 | 显示全部楼层
好资料,谢谢
740071911 发表于 2023-6-28 08:52 | 显示全部楼层
不错哦,价格怎么样呢
nawu 发表于 2023-7-4 16:04 | 显示全部楼层
当CPU要进行一次浮点运算时,可通过三种不同的浮点运算器来执行运算
tpgf 发表于 2023-7-4 16:51 | 显示全部楼层
有三种方式可以执行:软件仿真器(浮点运算函数库)、附加浮点运算器和集成浮点运算单元
gwsan 发表于 2023-7-4 17:13 | 显示全部楼层
目前基于ContexTM构架的ARM处理均集成了浮点运算单元
tfqi 发表于 2023-7-4 17:24 | 显示全部楼层
ARM 浮点架构 (VFP) 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持
aoyi 发表于 2023-7-4 18:00 | 显示全部楼层
在没有硬件浮点运算器的情况下,也可以进行浮点运算,但是计算速度会慢很多
zljiu 发表于 2023-7-4 18:41 | 显示全部楼层
在大多数现代计算机的架构中,浮点运算和整数运算是分开的
caigang13 发表于 2023-7-5 07:26 来自手机 | 显示全部楼层
浮点运算单元是硬件实现的,肯定比软件快。
两只袜子 发表于 2023-7-5 09:33 来自手机 | 显示全部楼层
好文章支持一下
两只袜子 发表于 2023-7-5 09:33 来自手机 | 显示全部楼层
好文章支持一下
xiaohn 发表于 2024-7-26 12:21 | 显示全部楼层
按照用户手册,的步骤,最终卡在第6步,FPU_ISTS 寄存器一直是busy。
对于 SUM 、SUB 、PRDCT 、SUMSQ ,建议配置如下:
1 - 配置 FPU_CTRL 寄存器,选择需要的模式,
2 - 在 nLEN 字段录入 n 的值,
3 - 设置起始(STR)位
4 - P0 操作数写入 FPU_FPI1
5 - P1..n-1 的操作数依次写入 FPU_FPI2
6 - 等待中断完成或者检查 FPU_ISTS 寄存器的完成(DONE)标志从 FPU_FPO 读取结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

115

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部