本帖最后由 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
结果单精度又比双精度快了……
|