MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
bench_time.h
Go to the documentation of this file.
1/**
2******************************************************************************
3* @file bench_time.h
4* @brief Заголовочный файл для измерения времени между событиями
5******************************************************************************
6* @addtogroup BENCH_TIME Time measurement
7* @ingroup MYLIBS_DEFINES
8* @brief Библиотека для измерения времени/тиков между событиями
9* @details
10Поддерживает:
11- Многоканальные измерения (несколько независимых таймеров)
12- Платформонезависимый интерфейс
13- Измерение в тиках или временных единицах
14- Статистику измерений (мин/макс/среднее)
15- Настраиваемый размер тиков для каждого канала
16
17Параметры для конфигурации:
18- @ref BENCH_TIME_ENABLE - Включить бенч времени
19- @ref BENCH_TIME_MAX_CHANNELS - Максимальное количество каналов измерения (по умолчанию 8)
20
21@par Пример использования:
22@code
23#include "bench_time.h"
24
25// Инициализация
26BenchTime_Init();
27
28// Измерение с SysTick
29BenchTime_Start(0, HAL_GetTick, 0xFFFFFFFF);
30some_function();
31uint32_t time = BenchTime_End(0, HAL_GetTick);
32
33// Измерение с TIM2 (16-бит)
34BenchTime_Start(1, TIM2->CNT, 0xFFFF);
35fast_function();
36uint32_t time2 = BenchTime_End(1, TIM2->CNT);
37
38// Измерение с DWT цикловым счетчиком
39BenchTime_Start(2, DWT->CYCCNT, 0xFFFFFFFF);
40critical_function();
41uint32_t cycles = BenchTime_End(2, DWT->CYCCNT);
42
43// Многоканальное измерение
44BenchTime_Start(0, HAL_GetTick, 1000); // общее время
45BenchTime_Start(1, TIM3->CNT, 500); // часть 1
46
47// ... код 1
48
49uint32_t part1 = BenchTime_End(1, TIM3->CNT);
50BenchTime_Start(2, TIM4->CNT, 200); // часть 2
51
52// ... код 2
53
54uint32_t part2 = BenchTime_End(2, TIM4->CNT);
55uint32_t total = BenchTime_End(0, HAL_GetTick); // общее время
56
57// Статистика
58uint32_t min_time = BenchTime_GetMin(0);
59uint32_t max_time = BenchTime_GetMax(0);
60uint32_t avg_time = BenchTime_GetAverage(0);
61uint32_t count = BenchTime_GetCount(0);
62@endcode
63* @{
64*****************************************************************************/
65#ifndef __BENCH_TIME_H_
66#define __BENCH_TIME_H_
67
68#include "mylibs_defs.h"
69#include <stdint.h>
70
71#ifdef BENCH_TIME_ENABLE
72
73// Конфигурация библиотеки
74#ifndef BENCH_TIME_MAX_CHANNELS
75#define BENCH_TIME_MAX_CHANNELS 8 ///< Максимальное количество каналов измерения
76#endif
77
78/**
79 * @brief Структура статистики измерений
80 */
81typedef struct {
82 uint32_t min_ticks; ///< Минимальное время в тиках
83 uint32_t max_ticks; ///< Максимальное время в тиках
84 uint32_t total_ticks; ///< Суммарное время в тиках
85 uint32_t count; ///< Количество измерений
86 uint32_t last_ticks; ///< Последнее измеренное время
88
89/**
90 * @brief Структура канала измерения
91 */
92typedef struct {
93 uint32_t start_tick; ///< Время старта в тиках
94 uint32_t tick_period; ///< Период тиков для переполнения
95 uint32_t is_running; ///< Флаг активного измерения
96 BenchTimeStats_t stats; ///< Статистика измерений
98
99/**
100 * @brief Основная структура менеджера измерений
101 */
102typedef struct {
103 BenchTimeChannel_t channels[BENCH_TIME_MAX_CHANNELS]; ///< Каналы измерения
105
106static BenchTime_t hbt = {0}; ///< Внутренний экземпляр
107
108/**
109 * @brief Инициализация системы измерения времени
110 */
111static inline void BenchTime_Init(void) {
112 for (int i = 0; i < BENCH_TIME_MAX_CHANNELS; i++) {
113 hbt.channels[i].start_tick = 0;
114 hbt.channels[i].tick_period = 0xFFFFFFFF;
115 hbt.channels[i].is_running = 0;
116 hbt.channels[i].stats.min_ticks = 0xFFFFFFFF;
117 hbt.channels[i].stats.max_ticks = 0;
118 hbt.channels[i].stats.total_ticks = 0;
119 hbt.channels[i].stats.count = 0;
120 hbt.channels[i].stats.last_ticks = 0;
121 }
122}
123
124/**
125 * @brief Начало измерения на указанном канале
126 * @param channel Номер канала (0..BENCH_TIME_MAX_CHANNELS-1)
127 * @param ticks Источник тиков (например: HAL_GetTick(), TIM2->CNT, DWT->CYCCNT)
128 * @param tick_period Период тиков для переполнения
129 * @return 1 - успех, 0 - ошибка
130 */
131static inline uint32_t BenchTime_Start(uint8_t channel, uint32_t ticks, uint32_t tick_period) {
132 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
133 if (hbt.channels[channel].is_running) return 0;
134
135 hbt.channels[channel].start_tick = ticks;
136 hbt.channels[channel].tick_period = tick_period;
137 hbt.channels[channel].is_running = 1;
138 return 1;
139}
140
141/**
142 * @brief Окончание измерения на указанном канале
143 * @param channel Номер канала (0..BENCH_TIME_MAX_CHANNELS-1)
144 * @param ticks Источник тиков (должен быть тот же что в Start)
145 * @return Измеренное время в тиках, 0 - в случае ошибки
146 */
147static inline uint32_t BenchTime_End(uint8_t channel, uint32_t ticks) {
148 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
149 if (!hbt.channels[channel].is_running) return 0;
150
151 uint32_t end_tick = ticks;
152 uint32_t start_tick = hbt.channels[channel].start_tick;
153 uint32_t tick_period = hbt.channels[channel].tick_period;
154 uint32_t elapsed_ticks;
155
156 if (end_tick >= start_tick) {
157 elapsed_ticks = end_tick - start_tick;
158 } else {
159 elapsed_ticks = (tick_period - start_tick) + end_tick + 1;
160 }
161
162 if (elapsed_ticks > tick_period) {
163 elapsed_ticks = tick_period;
164 }
165
166 hbt.channels[channel].is_running = 0;
167
168 // Обновление статистики
169 BenchTimeStats_t* stats = &hbt.channels[channel].stats;
170 stats->last_ticks = elapsed_ticks;
171
172 if (elapsed_ticks < stats->min_ticks) {
173 stats->min_ticks = elapsed_ticks;
174 }
175
176 if (elapsed_ticks > stats->max_ticks) {
177 stats->max_ticks = elapsed_ticks;
178 }
179
180 stats->total_ticks += elapsed_ticks;
181 stats->count++;
182
183 return elapsed_ticks;
184}
185
186/**
187 * @brief Получение минимального времени измерения
188 */
189static inline uint32_t BenchTime_GetMin(uint8_t channel) {
190 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
191 return hbt.channels[channel].stats.min_ticks;
192}
193
194/**
195 * @brief Получение максимального времени измерения
196 */
197static inline uint32_t BenchTime_GetMax(uint8_t channel) {
198 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
199 return hbt.channels[channel].stats.max_ticks;
200}
201
202/**
203 * @brief Получение среднего времени измерения
204 */
205static inline uint32_t BenchTime_GetAverage(uint8_t channel) {
206 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
207 BenchTimeStats_t* stats = &hbt.channels[channel].stats;
208 if (stats->count == 0) return 0;
209 return stats->total_ticks / stats->count;
210}
211
212/**
213 * @brief Получение количества измерений
214 */
215static inline uint32_t BenchTime_GetCount(uint8_t channel) {
216 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
217 return hbt.channels[channel].stats.count;
218}
219
220/**
221 * @brief Получение последнего измеренного времени
222 */
223static inline uint32_t BenchTime_GetLast(uint8_t channel) {
224 if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
225 return hbt.channels[channel].stats.last_ticks;
226}
227
228/**
229 * @brief Сброс статистики для канала
230 */
231static inline void BenchTime_ResetStats(uint8_t channel) {
232 if (channel >= BENCH_TIME_MAX_CHANNELS) return;
233 BenchTimeStats_t* stats = &hbt.channels[channel].stats;
234 stats->min_ticks = 0xFFFFFFFF;
235 stats->max_ticks = 0;
236 stats->total_ticks = 0;
237 stats->count = 0;
238 stats->last_ticks = 0;
239}
240#else //BENCH_TIME_ENABLE
241
242#define BenchTime_Init()
243#define BenchTime_Start(channel, ticks, tick_period) 0
244#define BenchTime_End(channel, ticks) 0
245#define BenchTime_GetMin(channel) 0
246#define BenchTime_GetMax(channel) 0
247#define BenchTime_GetAverage(channel) 0
248#define BenchTime_GetCount(channel) 0
249#define BenchTime_GetLast(channel) 0
250#define BenchTime_ResetStats(channel)
251
252#endif //BENCH_TIME_ENABLE
253
254#endif // __BENCH_TIME_H_
255
256/** BENCH_TIME
257 * @}
258 */
static uint32_t BenchTime_GetMax(uint8_t channel)
Получение максимального времени измерения
Definition bench_time.h:197
static uint32_t BenchTime_GetAverage(uint8_t channel)
Получение среднего времени измерения
Definition bench_time.h:205
static uint32_t BenchTime_GetMin(uint8_t channel)
Получение минимального времени измерения
Definition bench_time.h:189
static void BenchTime_ResetStats(uint8_t channel)
Сброс статистики для канала
Definition bench_time.h:231
static uint32_t BenchTime_End(uint8_t channel, uint32_t ticks)
Окончание измерения на указанном канале
Definition bench_time.h:147
static BenchTime_t hbt
Внутренний экземпляр
Definition bench_time.h:106
static void BenchTime_Init(void)
Инициализация системы измерения времени
Definition bench_time.h:111
static uint32_t BenchTime_GetCount(uint8_t channel)
Получение количества измерений
Definition bench_time.h:215
static uint32_t BenchTime_Start(uint8_t channel, uint32_t ticks, uint32_t tick_period)
Начало измерения на указанном канале
Definition bench_time.h:131
static uint32_t BenchTime_GetLast(uint8_t channel)
Получение последнего измеренного времени
Definition bench_time.h:223
#define BENCH_TIME_MAX_CHANNELS
Максимальное количество каналов измерения
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
Основная структура менеджера измерений
Definition bench_time.h:102
BenchTimeChannel_t channels[16]
Каналы измерения
Definition bench_time.h:103
Структура канала измерения
Definition bench_time.h:92
uint32_t tick_period
Период тиков для переполнения
Definition bench_time.h:94
uint32_t is_running
Флаг активного измерения
Definition bench_time.h:95
BenchTimeStats_t stats
Статистика измерений
Definition bench_time.h:96
uint32_t start_tick
Время старта в тиках
Definition bench_time.h:93
Структура статистики измерений
Definition bench_time.h:81
uint32_t total_ticks
Суммарное время в тиках
Definition bench_time.h:84
uint32_t last_ticks
Последнее измеренное время
Definition bench_time.h:86
uint32_t min_ticks
Минимальное время в тиках
Definition bench_time.h:82
uint32_t max_ticks
Максимальное время в тиках
Definition bench_time.h:83
uint32_t count
Количество измерений
Definition bench_time.h:85