816|0

1239

帖子

68

TA的资源

纯净的硅(中级)

楼主
 

【STM32H7S78-DK】测评+DSP计算速度评估 [复制链接]

本帖最后由 dql2016 于 2024-10-10 22:33 编辑

在前面的帖子中,顺利的添加了DSP库进行数学计算,本帖添加傻孩子大佬的开源性能评估库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官方论坛中找到了答案:

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.

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

修改后,打印正确:

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)
此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表