打印
[AT32F407]

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

[复制链接]
836|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tinnu|  楼主 | 2021-2-20 21:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tinnu 于 2021-2-20 22:39 编辑

开发环境 rtstudio


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


(二)开启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


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

4-添加dsp库文件:


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倍

测试程序:
        //cosf
        TMR_Cmd(TMR6, ENABLE);
        float t = 3.0, t2 = 1.0;
        for(int i=0; i<10000; i++)
        {
            cosf(t);
            t+=1;
            cosf(t);
            t-=1;
        }
        TMR_Cmd(TMR6, DISABLE);

        int t_useTime = TMR6->CNT;
        char t_char[10];
        itoa(t_useTime, t_char, 10);
        PRINT_UART1("cosf\t:");
        for(int i=0; i<strlen(t_char); i++)
        {
            USART_SendData(USART1, t_char[i]);
            while(USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
        }
        printf("\r\n");
        TMR6->CNT = 0;

        //div
        TMR_Cmd(TMR6, ENABLE);
        for(int i=0; i<10000; i++)
        {
            t2/t;
            t+=1;
            t2/t;
            t-=1;
        }
        TMR_Cmd(TMR6, DISABLE);

        t_useTime = TMR6->CNT;
        itoa(t_useTime, t_char, 10);
        PRINT_UART1("div\t:");
        for(int i=0; i<strlen(t_char); i++)
        {
            USART_SendData(USART1, t_char[i]);
            while(USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
        }
        printf("\r\n");
        TMR6->CNT = 0;

        //arm_cos_f32
        TMR_Cmd(TMR6, ENABLE);
        for(int i=0; i<10000; i++)
        {
            arm_cos_f32(t);
            t+=1;
            arm_cos_f32(t);
            t-=1;
        }
        TMR_Cmd(TMR6, DISABLE);

        t_useTime = TMR6->CNT;
        itoa(t_useTime, t_char, 10);
        printf("arm_cos_f32:");
        for(int i=0; i<strlen(t_char); i++)
        {
            USART_SendData(USART1, t_char[i]);
            while(USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
        }
        printf("\r\n");
        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
结果单精度又比双精度快了……



使用特权

评论回复
沙发
xdqfc| | 2021-2-21 09:29 | 只看该作者
本帖最后由 muyichuan2012 于 2021-2-21 11:27 编辑

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

使用特权

评论回复
板凳
Tanxjxj120a| | 2021-2-21 12:41 | 只看该作者
谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

71

帖子

0

粉丝