在前面的帖子中,顺利的添加了DSP库进行数学计算,本帖添加傻孩子大佬的开源性能评估库perf_counter(https://github.com/GorgonMeducer/perf_counter)进行计算性能的测试,通过计算耗时来衡量DSP性能。
perf_counter是一个基于C语言的模块,提供以下功能:
精确测量系统性能
精确测量函数执行时间
精确测量中断响应延迟
提供精确到us级的阻塞或非阻塞的延时服务
改善伪随机数的随机数特性
提供系统时间戳
……
它使用了SysTick却不会占用SysTick,支持所有Cortex-M处理器裸机环境和RTOS环境、KEIL、IAR、GCC等编译器平台都支持。下载源码包后得到下面文件:
对于裸机,只需将图中的4个文件加入到工程中即可:
首先在mian.c加入对头文件的引用:
#include "perf_counter.h"
然后对 perf_counter 库进行初始化:
init_cycle_counter(false);
或者
init_cycle_counter(true);
如果用户并没有自己初始化 SysTick,传递 false 给函数 init_cycle_counter() 。
如果用户自己初始化了 SysTick,传递true 给函数 init_cycle_counter() 。
本项目生产的工程是初始化了SysTick,所以入口参数是true
在systick中断中调用perfc_port_insert_to_system_timer_insert_ovf_handler():
将前面帖子中计算RMS的打印屏蔽掉
//DSP库求均方根测试
static void DSP_RMS(void)
{
float32_t pSrc[10] = {0.7060f, 0.0318f, 0.2769f, 0.0462f, 0.0971f, 0.8235f, 0.6948f, 0.3171f,0.9502f, 0.0344f};
float32_t pResult;
uint32_t pIndex;
q31_t pSrc1[10];
q31_t pResult1;
q15_t pSrc2[10];
q15_t pResult2;
//printf("******** stm32h7s78-dk eeworld dsp test ***********\r\n");
arm_rms_f32(pSrc, 10, &pResult);
//printf("arm_rms_f32 : pResult = %f\r\n", pResult);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc1[pIndex] = rand();
}
arm_rms_q31(pSrc1, 10, &pResult1);
//printf("arm_rms_q31 : pResult = %d\r\n", pResult1);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc2[pIndex] = rand()%32768;
}
arm_rms_q15(pSrc2, 10, &pResult2);
//printf("arm_rms_q15 : pResult = %d\r\n", pResult2);
//printf("******************************************************************\r\n");
}
测量调用该函数耗时:
start_cycle_counter();
DSP_RMS();
int64_t lCycleUsed = stop_cycle_counter();
printf("cycle counter = %lld\n",lCycleUsed);
printf如果需要打印64位数据int64、uint64类型,需要开启完整标准输出库的支持:
直接编译下载程序,输出计算打印结果是0,在STM32官方论坛中找到了答案:
STM32CubeIDE uses a reduced library by default in order to reduce code size, as it's usually preferred for embedded development. Part of this tradeoff is dropping support for long long ints in printf-type functions.
> What can I do to print a 64-bit int value?
Change the runtime library from reduced to standard.
之前配置的是精简标准输出库,导致输出不正确。
修改后,打印正确:
stm32h7s7 主频配置的是600MHz,1/600 000 000 (s) * 35630(cycle) =5.938*10^-5 (s)=59.38us
可见计算速度还是很快的,总共计算了10个数据的arm_rms_f32、arm_rms_q31、arm_rms_q15。