你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

原创测量代码和算法运行时间

[复制链接]
作者:秋刀鱼的 2024-12-26 13:51:19 0 126

项目名称

原创测量代码和算法运行时间

项目主题

人工智能(AI) 物联网 

项目简介

原创测量代码和算法运行时间

项目图片

软硬件框图

演示视频

项目代码仓库

很多时候,我们设计完成一个“完美”的算法,比如无刷电机 FOC,BMS的kalman 滤波SOC,高级AI算法,人工神经网络,人脸识别,运动检测等等复杂算法后, 我们都需要对这个算法进行评测,比如,算法的复杂度,执行时间,效率等等!其中最重要的就是算法运行的时间了,简称执行时间。 作为嵌入式开发人员,我们需要知道自己设计的算法执行了多久。那么有没有一个工具能测试出我们的算法执行时间呢? 这篇测评报告就是来解决算法代码执行时间问题的。本文就以极海G32A1465开发板来运行这个时间检测算法,这个算法可以运行在所有ARM 内核的单片机上,只要单片机具备DWT定时器和Systick定时器,其中DWT是一个32位的定时器,可以精确计时到1us级别,Systick这个大家都非常的熟悉,用来裸机定时和RTOS移植都会用到,它是一个24位的定时器,相比较之下,DWT要比Systick定时精度更高,效果更好,所以本文会以DWT定时器来制作这个原创测量代码和算法运行时间算法库。以飨广大爱好者。 话不多少了,我们直接上干货!!!!!!

1。打开cubemx

image.png

b4d891f0927eaa5f44306d47a84f11c.jpg

选择STM32F769BIH6

2.image.pngb4d891f0927eaa5f44306d47a84f11c.jpg

2。使能外部时钟,配置时钟树

image.png

image.png

3。配置串口

image.png

image.png

4。配置LED1 LED2

image.png

image.png

5.image.png

image.png

image.png

6.打开KEIL,重定向printf

int fputc(int ch, FILE f) { HAL_UART_Transmit(&huart1, (uint8_t )&ch, 1, 0xFFFF); return ch; }

image.png

7。修改代码

/ Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init();

/ USER CODE BEGIN Init / CODE_TIME_START("开始执行代码时间测量"); / USER CODE END Init /

/ Configure the system clock / SystemClock_Config(); CODE_TIME_EVENT("SystemClock_Config()"); / USER CODE BEGIN SysInit /

/ USER CODE END SysInit /

/ Initialize all configured peripherals / MX_GPIO_Init(); CODE_TIME_EVENT("MX_GPIO_Init()"); MX_USART1_UART_Init(); CODE_TIME_EVENT("MX_USART1_UART_Init()"); / USER CODE BEGIN 2 /

printf("测试串口打印功能\r\n"); CODE_TIME_EVENT("测试串口打印功能 "); CODE_TIME_STOP(); / USER CODE END 2 /

image.png

烧录,打开串口助手查看

image.png

核心代码

ifndef _CODE_TIME_H

define _CODE_TIME_H

include "main.h"

include <stdint.h>

include <stdio.h>

define MAX_EVENT_COUNT 20

void CODE_TIME_START(const char profile_name); void CODE_TIME_EVENT(const char event); void CODE_TIME_STOP(void);

endif

/ Includes ----------------------------------------------------------/

include "code_time_measurement.h"

/ Private Definitions -----------------------------------------------/

define DEBUG_PRINTF printf

define __PROF_STOPED 0xFF

/ External variables ------------------------------------------------/ / Private variables -------------------------------------------------/ static uint32_t time_start; // profiler start time static const char prof_name; // profiler name static uint32_t time_event[MAX_EVENT_COUNT]; // events time static const char event_name[MAX_EVENT_COUNT]; // events name static uint8_t event_count = __PROF_STOPED; // events counter

/ Private function prototypes ---------------------------------------/ / -------------------------------------------------------------------/

/**

  • @brief 开始测量
  • @param profile_name Profiler name / void CODE_TIME_START(const char profile_name) { prof_name = profile_name; event_count = 0;

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // DWT->LAR = 0xC5ACCE55; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // enable counter //DWT->CYCCNT = time_start = 0; time_start = DWT->CYCCNT; }

/**

  • @brief 测量事件
  • @param event Event name / void CODE_TIME_EVENT(const char event) { if (event_count == __PROF_STOPED) return;

if (event_count < MAX_EVENT_COUNT) { time_event[event_count] = DWT->CYCCNT; event_name[event_count] = event; event_count++; } }

/**

  • @brief 结束测量 */ void CODE_TIME_STOP(void) { int32_t tick_per_1us; int32_t time_prev; int32_t timestamp; int32_t delta_t;

tick_per_1us = SystemCoreClock / 1000000;

if (event_count == __PROF_STOPED) { DEBUG_PRINTF("\r\nWarning: PROFILING_STOP WITHOUT START.\r\n"); return; }

DEBUG_PRINTF("Profiling \"%s\" sequence: \r\n" "--函数名----------------------|--总共消耗时间--|----函数消耗时间---\r\n", prof_name); time_prev = 0;

for (int i = 0; i < event_count; i++) { timestamp = (time_event[i] - time_start) / tick_per_1us; delta_t = timestamp - time_prev; time_prev = timestamp; DEBUG_PRINTF("%-30s:%9d µs | +%9d µs\r\n", event_name[i], timestamp, delta_t); } DEBUG_PRINTF("\r\n"); event_count = __PROF_STOPED; } [/i][/i]

1个附件

收藏 评论0 发布时间:2024-12-26 13:51

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版