[经验] 【STM32H7S78-DK】测评+DSP计算速度评估

dql2016   2024-10-10 21:28 楼主

在前面的帖子中,顺利的添加了DSP库进行数学计算,本帖添加傻孩子大佬的开源性能评估库perf_counter(https://github.com/GorgonMeducer/perf_counter)进行计算性能的测试,通过计算耗时来衡量DSP性能。

 

perf_counter是一个基于C语言的模块,提供以下功能:

  • 精确测量系统性能

  • 精确测量函数执行时间

  • 精确测量中断响应延迟

  • 提供精确到us级的阻塞或非阻塞的延时服务

  • 改善伪随机数的随机数特性

  • 提供系统时间戳

  • ……

它使用了SysTick却不会占用SysTick,支持所有Cortex-M处理器裸机环境和RTOS环境、KEIL、IAR、GCC等编译器平台都支持。下载源码包后得到下面文件:

屏幕截图 2024-10-10 215307.png

对于裸机,只需将图中的4个文件加入到工程中即可:

屏幕截图 2024-10-10 215443.png

 

首先在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 

屏幕截图 2024-10-10 215912.png

 

 

在systick中断中调用perfc_port_insert_to_system_timer_insert_ovf_handler():

11.png

将前面帖子中计算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);
屏幕截图 2024-10-10 220051.png

 

printf如果需要打印64位数据int64、uint64类型,需要开启完整标准输出库的支持:

屏幕截图 2024-10-10 214036.png

直接编译下载程序,输出计算打印结果是0,在STM32官方论坛中找到了答案:

https://community.st.com/t5/stm32cubeide-mcus/wrong-result-when-printing-a-int64-t-value-using-stm32cubeide/td-p/148913

 

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.

之前配置的是精简标准输出库,导致输出不正确。

修改后,打印正确:

屏幕截图 2024-10-10 220609.png

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。

stm32cubeide_workspace_dsp_perf_counter.zip (17.42 MB)
(下载次数: 0, 2024-10-10 22:11 上传)
本帖最后由 dql2016 于 2024-10-10 22:33 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复