搜索

[AT32F407] 【AT-START-F407测评】rtstudio DSP与FPU五种条件测试cos与除法运算

[复制链接]
96|2
 楼主 | 2021-2-20 21:21 | 显示全部楼层 |阅读模式
本帖最后由 tinnu 于 2021-2-20 22:39 编辑

开发环境 rtstudio


(一)开启硬件浮点
rtstudio开启硬件浮点不需要像MDK那样处理宏定义,只需要:
1.png

(二)开启DSP
1-把arm_math.h拖过去
位置在BSP包:
Artery-AT32-MCU-Pack-main\BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport

2-添加宏定义:
ARM_MATH_CM4
2.png

3-包含头文件
#include "arm_math.h"

4-添加dsp库文件:
3.png

5-相关例子在:
Artery-AT32-MCU-Pack-main\BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\DSP_Lib\Examples
dsp专用函数如 arm_cos_f32 就可以使用了。

(三)测试

对cosf、除法、arm_cos_f32跑10000x2轮:

1-关掉FPU情况下
使用非浮点DSP:arm_cortexM4l_math
声明了:ARM_MATH_CM4
头文件:#include "arm_math.h"

cosf    :5877
div    :5876
arm_cos_f32:3384

2-关掉FPU情况下

使用非浮点DSP:arm_cortexM4l_math
不声明ARM_MATH_CM4
头文件:#include "math.h"
情况与上面相同,但此时不能使用arm_cos_f32:

cosf    :5877
div    :5876

3-开启FPU情况下
使用浮点DSP:arm_cortexM4lf_math
不声明ARM_MATH_CM4
头文件:#include "math.h"

cosf    :1125
div    :1126

4-开启FPU情况下
使用浮点DSP:arm_cortexM4lf_math
声明ARM_MATH_CM4
头文件:#include "math.h"

cosf    :1125
div    :1126

5-开启FPU情况下
使用浮点DSP:arm_cortexM4lf_math
声明ARM_MATH_CM4
头文件:#include "arm_math.h"

cosf    :126
div     :125
arm_cos_f32:460

出乎意料的是,使用dsp竟然比不上cosf,但一使用arm_math 头文件后,cosf的速度立即提升10倍,开始猜测应该内部是经过了某些操作。
但奇怪的是,后来重复了一次这个实验,结果又不一样了:
cosf    :1125
div    :1126
arm_cos_f32:459

而单单开启硬件浮点的话,速度提升5倍

测试程序:
  1.         //cosf
  2.         TMR_Cmd(TMR6, ENABLE);
  3.         float t = 3.0, t2 = 1.0;
  4.         for(int i=0; i<10000; i++)
  5.         {
  6.             cosf(t);
  7.             t+=1;
  8.             cosf(t);
  9.             t-=1;
  10.         }
  11.         TMR_Cmd(TMR6, DISABLE);

  12.         int t_useTime = TMR6->CNT;
  13.         char t_char[10];
  14.         itoa(t_useTime, t_char, 10);
  15.         PRINT_UART1("cosf\t:");
  16.         for(int i=0; i<strlen(t_char); i++)
  17.         {
  18.             USART_SendData(USART1, t_char[i]);
  19.             while(USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
  20.         }
  21.         printf("\r\n");
  22.         TMR6->CNT = 0;

  23.         //div
  24.         TMR_Cmd(TMR6, ENABLE);
  25.         for(int i=0; i<10000; i++)
  26.         {
  27.             t2/t;
  28.             t+=1;
  29.             t2/t;
  30.             t-=1;
  31.         }
  32.         TMR_Cmd(TMR6, DISABLE);

  33.         t_useTime = TMR6->CNT;
  34.         itoa(t_useTime, t_char, 10);
  35.         PRINT_UART1("div\t:");
  36.         for(int i=0; i<strlen(t_char); i++)
  37.         {
  38.             USART_SendData(USART1, t_char[i]);
  39.             while(USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
  40.         }
  41.         printf("\r\n");
  42.         TMR6->CNT = 0;

  43.         //arm_cos_f32
  44.         TMR_Cmd(TMR6, ENABLE);
  45.         for(int i=0; i<10000; i++)
  46.         {
  47.             arm_cos_f32(t);
  48.             t+=1;
  49.             arm_cos_f32(t);
  50.             t-=1;
  51.         }
  52.         TMR_Cmd(TMR6, DISABLE);

  53.         t_useTime = TMR6->CNT;
  54.         itoa(t_useTime, t_char, 10);
  55.         printf("arm_cos_f32:");
  56.         for(int i=0; i<strlen(t_char); i++)
  57.         {
  58.             USART_SendData(USART1, t_char[i]);
  59.             while(USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
  60.         }
  61.         printf("\r\n");
  62.         TMR6->CNT = 0;
复制代码



(四)开方测试
随后测试了下开放,结果发现一直报sqrtf找不到。
这时候需要在(三)-4 这里需要额外添加一个m,即-lm编译


测试结果有些出乎意料:
sqrtf    :28630
sqrt    :15479
arm_sqrt_f32:6418

虽然这回dsp是比math的函数快了,但双精度浮点的sqrt竟然比sqrtf更快,要知道m4f内核是只支持单精度加速的,为此我又回去测试了一次cosf:
cosf    :1125
cos    :2376
arm_cos_f32:459
结果单精度又比双精度快了……



使用特权

评论回复
| 2021-2-21 09:29 | 显示全部楼层
本帖最后由 muyichuan2012 于 2021-2-21 11:27 编辑

楼主要是追求这些运算的话,应该选带运算外设的单片机,AT32不知道有没有类似的。那个算起来就快多了。

使用特权

评论回复
| 2021-2-21 12:41 | 显示全部楼层
谢谢分享

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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