Добавлен модуль для оптимизации по эволюционному алгоритму
This commit is contained in:
273
MyLibsGeneral/Inc/evolve_optimizer.h
Normal file
273
MyLibsGeneral/Inc/evolve_optimizer.h
Normal file
@@ -0,0 +1,273 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file evolve_optimizer.h
|
||||
* @brief Заголовочный файл для адаптивного подбора параметров
|
||||
******************************************************************************
|
||||
* @addtogroup EVOLVE_OPTIMIZER Evolve optimizer
|
||||
* @ingroup MYLIBS_DEFINES
|
||||
* @brief Библиотека для эволюционного подбора параметров
|
||||
* @details
|
||||
Поддерживает:
|
||||
- Любое количество параметров
|
||||
- Генерацию новых параметров на основе лучших кандидатов
|
||||
- Мутацию для поиска оптимальных параметров
|
||||
- Несколько независимых оптимизаторов в одной программе
|
||||
|
||||
Если библиотека отключена @ref ENABLE_EVOLVE_OPTIMIZATION, то вставляются
|
||||
заглушки, никак не влияющие на параметры и остальную программу
|
||||
|
||||
@par Пример использования:
|
||||
@code
|
||||
#include "evolve_optimizer.h"
|
||||
#define N_PARAMS 4
|
||||
#define N_CANDIDATES 100
|
||||
#define N_BEST 10
|
||||
#define IQ_MUTATION (PARAM_SCALE_Q16(0.1, 0, 1))
|
||||
int32_t params[N_PARAMS];
|
||||
EvolveOptimizer_t optimizer;
|
||||
|
||||
// Формирование параметров
|
||||
uint16_t param_u16 = 800;
|
||||
float param_f = 0.01f;
|
||||
uint8_t param_u8 = 40;
|
||||
int16_t param_i16 = 1600;
|
||||
params[0] = PARAM_SCALE_Q16(param_u16, 0, 1000);
|
||||
params[1] = PARAM_SCALE_Q16(param_f, 0.001f, 0.1f);
|
||||
params[2] = PARAM_SCALE_Q16(param_u8, 10, 100);
|
||||
params[3] = PARAM_SCALE_Q16(param_i16, 500, 5000);
|
||||
|
||||
// Инициалиазция
|
||||
EvolveOptimizer_Init(&optimizer, N_PARAMS, N_CANDIDATES, N_BEST, IQ_MUTATION, params);
|
||||
|
||||
// Шаг эволюции
|
||||
int32_t loss = calc_iq_loss(); // расчет эффективности параметров
|
||||
EvolveOptimizer_Step(&optimizer, params, loss);
|
||||
|
||||
// Взятие следующих для эволюции параметров
|
||||
param_u16 = PARAM_UNSCALE_Q16(params[0], 0, 1000);
|
||||
param_f = PARAM_UNSCALE_Q16(params[1], 0.001f, 0.1f);
|
||||
param_u8 = PARAM_UNSCALE_Q16(params[2], 10, 100);
|
||||
param_i16 = PARAM_UNSCALE_Q16(params[3], 500, 5000);
|
||||
@endcode
|
||||
* @{
|
||||
*****************************************************************************/
|
||||
#ifndef __EVOLVE_OPTIMIZER_H_
|
||||
#define __EVOLVE_OPTIMIZER_H_
|
||||
|
||||
#include "mylibs_defs.h"
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef ENABLE_EVOLVE_OPTIMIZATION
|
||||
/**
|
||||
* @brief Линейное масштабирование x из диапазона [min_val, max_val] в Q16.16 [0, 65536)
|
||||
*/
|
||||
#define PARAM_SCALE_Q16(x, min_val, max_val) \
|
||||
((int32_t)((((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val))) * 65536.0f))
|
||||
|
||||
/**
|
||||
* @brief Обратное линейное масштабирование Q16.16 значения в диапазон [min_val, max_val]
|
||||
*/
|
||||
#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) \
|
||||
(((float)(q16_val) / 65536.0f) * ((float)(max_val) - (float)(min_val)) + (float)(min_val))
|
||||
|
||||
|
||||
/**
|
||||
* @brief Структура эволюционного оптимизатора
|
||||
*/
|
||||
typedef struct {
|
||||
uint16_t n_params; ///< Количество параметров
|
||||
uint16_t n_cand; ///< Количество кандидатов
|
||||
uint16_t n_best; ///< Количество лучших, усредняемых
|
||||
uint16_t iq_mutation; ///< Амплитуда мутации в Q16.16
|
||||
uint16_t cand_index; ///< Индекс кандидата для обработки
|
||||
int32_t loss[EVOLVE_MAX_CANDIDATES]; ///< Loss для каждого кандидата
|
||||
int32_t candidates[EVOLVE_MAX_CANDIDATES][EVOLVE_MAX_PARAMS]; ///< Параметры кандидатов
|
||||
uint16_t sorted_idx[EVOLVE_MAX_CANDIDATES]; ///< Индексы отсортированных кандидатов
|
||||
} EvolveOptimizer_t;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @cond EVOLVE_INTERNAL
|
||||
*/
|
||||
#define Q16_MUL(a,b) ((int32_t)(((int64_t)(a) * (int64_t)(b)) >> 16))
|
||||
|
||||
// Вспомогательный указатель для сортировки
|
||||
static EvolveOptimizer_t *g_sort_opt; // глобальный указатель на текущий оптимизатор
|
||||
|
||||
static int cmp_idx(const void *a, const void *b) {
|
||||
if (g_sort_opt->loss[*(const uint16_t*)a] < g_sort_opt->loss[*(const uint16_t*)b])
|
||||
return -1;
|
||||
if (g_sort_opt->loss[*(const uint16_t*)a] > g_sort_opt->loss[*(const uint16_t*)b])
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
/** @endcond */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Инициализация эволюционного оптимизатора.
|
||||
* @param opt Указатель на структуру оптимизатора
|
||||
* @param n_params Количество параметров в одном кандидате
|
||||
* @param n_cand Количество кандидатов
|
||||
* @param n_best Количество лучших, усредняемых
|
||||
* @param iq_mutation Амплитуда мутации в Q16.16
|
||||
* @param start_params Начальные параметры (Q16.16)
|
||||
*/
|
||||
__STATIC_INLINE HAL_StatusTypeDef EvolveOptimizer_Init(EvolveOptimizer_t* opt,
|
||||
uint16_t n_params,
|
||||
uint16_t n_cand,
|
||||
uint16_t n_best,
|
||||
uint16_t iq_mutation,
|
||||
int32_t* start_params)
|
||||
{
|
||||
if(check_null_ptr_2(opt, start_params))
|
||||
return HAL_ERROR;
|
||||
|
||||
if(n_params > EVOLVE_MAX_PARAMS)
|
||||
return HAL_ERROR;
|
||||
opt->n_params = n_params;
|
||||
|
||||
if(n_cand > EVOLVE_MAX_CANDIDATES)
|
||||
return HAL_ERROR;
|
||||
opt->n_cand = n_cand;
|
||||
|
||||
if(n_best > EVOLVE_MAX_CANDIDATES/2)
|
||||
return HAL_ERROR;
|
||||
opt->n_best = n_best;
|
||||
|
||||
if(iq_mutation > 32768)
|
||||
return HAL_ERROR;
|
||||
opt->iq_mutation = iq_mutation;
|
||||
|
||||
for (uint16_t i = 0; i < n_cand; i++) {
|
||||
for (uint16_t j = 0; j < n_params; j++) {
|
||||
opt->candidates[i][j] = start_params[j];
|
||||
}
|
||||
opt->loss[i] = 0;
|
||||
}
|
||||
uint32_t seed = HAL_GetTick() + (ADC1->DR & 0xFF);
|
||||
srand(seed);
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Один шаг эволюционного оптимизатора.
|
||||
* @param opt Указатель на структуру оптимизатора
|
||||
* @param params Массив параметров, которые будут обновлены (на выходе — новые параметры)
|
||||
* @param loss Loss текущего кандидата (Q16.16)
|
||||
* @details
|
||||
* Сохраняет loss текущего кандидата и формирует параметры следующего кандидата.
|
||||
* Если накоплено n_cand кандидатов, генерируется новое поколение.
|
||||
* Новое поколение формируется случайным выбором из n_best лучших с добавлением мутации.
|
||||
*
|
||||
* На выходе params содержит параметры следующего кандидата для измерений.
|
||||
* @note Функция использует глобальную внутреннюю переменную для сортировки.
|
||||
* Надо убедится что только один экземпляр функции запущен в момент времени
|
||||
*/
|
||||
__STATIC_INLINE HAL_StatusTypeDef EvolveOptimizer_Step(EvolveOptimizer_t* opt,
|
||||
int32_t* params,
|
||||
int32_t loss)
|
||||
{
|
||||
if(check_null_ptr_2(opt, params))
|
||||
return HAL_ERROR;
|
||||
|
||||
uint16_t n_params = opt->n_params;
|
||||
if(n_params > EVOLVE_MAX_PARAMS)
|
||||
return HAL_ERROR;
|
||||
|
||||
uint16_t n_cand = opt->n_cand;
|
||||
if(n_cand > EVOLVE_MAX_CANDIDATES)
|
||||
return HAL_ERROR;
|
||||
|
||||
uint16_t n_best = opt->n_best;
|
||||
if(n_best > EVOLVE_MAX_CANDIDATES/2)
|
||||
return HAL_ERROR;
|
||||
|
||||
uint16_t mut = opt->iq_mutation;
|
||||
if(mut > 32768)
|
||||
return HAL_ERROR;
|
||||
|
||||
// 1. Сохраняем loss текущего кандидата
|
||||
opt->loss[opt->cand_index] = loss;
|
||||
opt->cand_index++;
|
||||
|
||||
if (opt->cand_index >= n_cand) {
|
||||
// 2. Сортируем текущее поколение по loss
|
||||
for(uint16_t i = 0; i < opt->n_cand; i++)
|
||||
opt->sorted_idx[i] = i;
|
||||
|
||||
g_sort_opt = opt;
|
||||
qsort(opt->sorted_idx, opt->n_cand, sizeof(uint16_t), cmp_idx);
|
||||
g_sort_opt = NULL;
|
||||
// for (uint16_t i = 0; i < n_cand - 1; i++) {
|
||||
// for (uint16_t j = i + 1; j < n_cand; j++) {
|
||||
// if (opt->loss[j] < opt->loss[i]) {
|
||||
// int32_t tmp_loss = opt->loss[i];
|
||||
// opt->loss[i] = opt->loss[j];
|
||||
// opt->loss[j] = tmp_loss;
|
||||
|
||||
// for (uint16_t k = 0; k < n_params; k++) {
|
||||
// int32_t tmp = opt->candidates[i][k];
|
||||
// opt->candidates[i][k] = opt->candidates[j][k];
|
||||
// opt->candidates[j][k] = tmp;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// 3. Генерируем новое поколение: каждый кандидат берется случайно из лучших с мутацией
|
||||
uint16_t n_elite = 2; // количество элитных кандидатов, которые сохраняем без изменений
|
||||
for (uint16_t c = 0; c < n_cand; c++) {
|
||||
if (c < n_elite) {
|
||||
// Копируем лучших кандидатов напрямую без мутации
|
||||
for (uint16_t i = 0; i < n_params; i++) {
|
||||
opt->candidates[c][i] = opt->candidates[opt->sorted_idx[c]][i]; // просто сохраняем параметры
|
||||
}
|
||||
opt->loss[c] = 0;
|
||||
} else {
|
||||
// Остальные кандидаты формируются с кроссовером и мутацией
|
||||
for (uint16_t i = 0; i < n_params; i++) {
|
||||
int32_t noise = (rand() % (2 * mut)) - mut;
|
||||
uint16_t parent = opt->sorted_idx[rand() % opt->n_best]; // каждый параметр из случайного лучшего
|
||||
opt->candidates[c][i] = opt->candidates[parent][i] + noise;
|
||||
}
|
||||
opt->loss[c] = 0;
|
||||
}
|
||||
}
|
||||
opt->cand_index = 0;
|
||||
}
|
||||
|
||||
// 4. Возвращаем параметры следующего кандидата
|
||||
for (uint16_t i = 0; i < opt->n_params; i++)
|
||||
params[i] = opt->candidates[opt->cand_index][i];
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
#else // ENABLE_EVOLVE_OPTIMIZATION
|
||||
//заглушки
|
||||
typedef struct {
|
||||
uint16_t n_params;
|
||||
uint16_t n_cand;
|
||||
uint16_t n_best;
|
||||
uint16_t iq_mutation;
|
||||
int32_t loss[0];
|
||||
int32_t candidates[0][0];
|
||||
} EvolveOptimizer_t;
|
||||
#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, iq_mutation, start_params)
|
||||
#define EvolveOptimizer_Step(opt, params, LossFunc)
|
||||
#define PARAM_SCALE_Q16(x, min_val, max_val) (x)
|
||||
#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) (q16_val)
|
||||
#endif // ENABLE_EVOLVE_OPTIMIZATION
|
||||
|
||||
#endif // __EVOLVE_OPTIMIZER_H_
|
||||
|
||||
/** EVOLVE_OPTIMIZER
|
||||
* @}
|
||||
*/
|
||||
@@ -54,6 +54,21 @@
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup EVOLVE_CONFIG Evolve configs
|
||||
* @ingroup MYLIBS_CONFIG
|
||||
* @brief Конфигурация однослойного персептрона и алгоритма обучения
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define ENABLE_EVOLVE_OPTIMIZATION ///< Включить оптимизацию параметров
|
||||
#define EVOLVE_MAX_PARAMS 20 ///< Максимальное количество параметров
|
||||
#define EVOLVE_MAX_CANDIDATES 100 ///< Максимальное количество кандидатов для обучения
|
||||
|
||||
/** EVOLVE_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup LIBS_CONFIG Libraries configs
|
||||
@@ -62,6 +77,7 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define INCLUDE_EVOLVE_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
|
||||
#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями
|
||||
#define INCLUDE_TRACKERS_LIB ///< Подключить библиотеку с трекерами
|
||||
#define INCLUDE_TRACE_LIB ///< Подключить библиотеку с трейсами
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* @file mylibs_defs.h
|
||||
* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
|
||||
**************************************************************************
|
||||
* @defgroup MYLIBS_DEFINES General Defines
|
||||
* @defgroup MYLIBS_DEFINES General Tools
|
||||
* @ingroup MYLIBS_ALL
|
||||
* @brief Общие макросы и typedef'ы, используемые по всему проекту
|
||||
*
|
||||
@@ -54,10 +54,6 @@ extern void Error_Handler(void);
|
||||
*/
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
********************************ACCESS_DEFINES*****************************/
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
******************************DELAYS_DEFINES*******************************/
|
||||
/**
|
||||
@@ -137,7 +133,8 @@ extern void Error_Handler(void);
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*******************************MATH_DEFINES********************************/
|
||||
*******************************UTIL_DEFINES********************************/
|
||||
static int dummy;
|
||||
/**
|
||||
* @addtogroup UTILS_DEFINES Utils defines
|
||||
* @ingroup MYLIBS_DEFINES
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
#ifdef ARM_MATH_CM4
|
||||
#include "arm_math.h"
|
||||
#else
|
||||
#include "math.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -39,13 +41,60 @@
|
||||
|
||||
#ifdef INCLUDE_TRACKERS_LIB
|
||||
#include "trackers.h"
|
||||
#else
|
||||
#define TrackerTypeDef(num_user_vars) void *
|
||||
#define num_of_usercnts(_user_) 0
|
||||
#define assert_tracecnt(_cntstruct_, _uservarnumb_) 0
|
||||
#define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(0)
|
||||
#define tern_assert_usertracker(_cntstruct_, _uservarnumb_) 0
|
||||
#define TrackerGet_Ok(_cntstruct_) dummy
|
||||
#define TrackerGet_Err(_cntstruct_) dummy
|
||||
#define TrackerGet_Warn(_cntstruct_) dummy
|
||||
#define TrackerGet_User(_cntstruct_, _uservarnumb_) dummy
|
||||
#define TrackerCnt_Ok(_cntstruct_)
|
||||
#define TrackerCnt_Err(_cntstruct_)
|
||||
#define TrackerCnt_Warn(_cntstruct_)
|
||||
#define TrackerCnt_User(_cntstruct_, _uservarnumb_)
|
||||
#define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
|
||||
#define TrackerClear_All(_cntstruct_)
|
||||
#define TrackerClear_Ok(_cntstruct_)
|
||||
#define TrackerClear_Err(_cntstruct_)
|
||||
#define TrackerClear_Warn(_cntstruct_)
|
||||
#define TrackerClear_User(_cntstruct_)
|
||||
#define TrackerClear_UserAll(_cntstruct_)
|
||||
#endif
|
||||
|
||||
#ifdef INCLUDE_TRACE_LIB
|
||||
#include "trace.h"
|
||||
#else
|
||||
#define my_printf(...)
|
||||
#define log_printf(TAG, fmt, ...)
|
||||
#define TRACE_GPIO_SET(_gpio_,_pin_)
|
||||
#define TRACE_GPIO_RESET(_gpio_,_pin_)
|
||||
#define RTT_FlashPrepare(...)
|
||||
#define RTT_EraseFlash(...) 0
|
||||
#define RTT_SaveToFlash(...) 0
|
||||
#define RTT_ReadFromFlash(...) 0
|
||||
#define HF_CheckRecovered(...) 0
|
||||
#define HF_HandleFault(...)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef INCLUDE_EVOLVE_OPTIMIZER
|
||||
#include "evolve_optimizer.h"
|
||||
#else
|
||||
typedef struct {
|
||||
uint16_t n_params;
|
||||
uint16_t n_cand;
|
||||
uint16_t n_best;
|
||||
uint16_t iq_mutation;
|
||||
int32_t loss[0];
|
||||
int32_t candidates[0][0];
|
||||
} EvolveOptimizer_t;
|
||||
#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, iq_mutation, start_params)
|
||||
#define EvolveOptimizer_Step(opt, params, LossFunc)
|
||||
#define PARAM_SCALE_Q16(x, min_val, max_val) (x)
|
||||
#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) (q16_val)
|
||||
#endif
|
||||
|
||||
#ifdef INCLUDE_GENERAL_PERIPH_LIBS
|
||||
|
||||
@@ -73,112 +122,4 @@
|
||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
||||
|
||||
|
||||
#endif // __MYLIBS_INCLUDE_H_
|
||||
|
||||
/**
|
||||
@mainpage
|
||||
|
||||
@section overview Обзор
|
||||
MyLibs - это набор библиотек для удобной работы с периферией микроконтроллеров STM32.
|
||||
|
||||
@subsection features Основные возможности
|
||||
|
||||
@subsubsection utils_module Общие утилиты @ref MYLIBS_DEFINES
|
||||
- Битовый доступ к регистрам через union
|
||||
- Трекеры для статистики и отладки
|
||||
- Макросы для задержек и утилит
|
||||
- Поддержка FreeRTOS
|
||||
|
||||
@subsubsection trace_module Трассировка @ref TRACE
|
||||
|
||||
- Serial трассировка через SWO и RTT
|
||||
- GPIO трассировка для отладки
|
||||
- Сохранение логов в Flash память
|
||||
- Обработка HardFault с сохранением контекста
|
||||
|
||||
@subsubsection gpio_module Модуль GPIO @ref MY_LIBS_GPIO
|
||||
- Управление светодиодами (включение/выключение, моргание, плавное затухание)
|
||||
- Работа с кнопками (чтение состояния, фильтрация дребезга)
|
||||
- Инициализация портов и тактирования
|
||||
- Поддержка альтернативных функций
|
||||
|
||||
@subsubsection tim_module Модуль таймеров @ref MY_LIBS_TIM
|
||||
|
||||
- Базовая инициализация таймеров
|
||||
- Режимы прерываний
|
||||
- Формирование задержек (блокирующие и неблокирующие)
|
||||
- Работа с энкодерами (чтение положения, обработка кнопок)
|
||||
- Настройка ШИМ и Output Compare
|
||||
|
||||
|
||||
@subsection structure Структура проекта
|
||||
|
||||
@code
|
||||
├── inc/ # Заголовочные файлы
|
||||
│ ├── mylibs_include.h # Главный include файл
|
||||
│ ├── mylibs_config.h # Конфигурация библиотек
|
||||
│ ├── mylibs_defs.h # Общие определения и макросы
|
||||
│ ├── bit_access.h # Битовый доступ к регистрам
|
||||
│ ├── trackers.h # Трекеры для отладки
|
||||
│ ├── trace.h # Трассировка и логирование
|
||||
│ ├── general_gpio.h # Работа с GPIO
|
||||
│ └── general_tim.h # Работа с таймерами
|
||||
└── src/ # Исходные файлы
|
||||
├── general_gpio.c # Реализация GPIO
|
||||
└── general_tim.c # Реализация TIM
|
||||
@endcode
|
||||
|
||||
@subsection usage_basic Использование
|
||||
|
||||
Инструкция по подключению:
|
||||
|
||||
1. Настройте конфигурацию @ref MYLIBS_CONFIG в @ref mylibs_config.h
|
||||
|
||||
2. Подключите главный заголовочный файл:
|
||||
@code
|
||||
#include "mylibs_include.h"
|
||||
@endcode
|
||||
|
||||
3. Используйте нужные модули в своем коде
|
||||
|
||||
@subsubsection gpio_example Пример работы с GPIO
|
||||
|
||||
@code
|
||||
// Инициализация светодиода
|
||||
MX_GPIO_Init();
|
||||
GPIO_LEDTypeDef led;
|
||||
GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 1);
|
||||
|
||||
// Включение светодиода
|
||||
GPIO_LED_On(&led);
|
||||
|
||||
// Запуск моргания
|
||||
GPIO_LED_Blink_Start(&led, 500); // Период 500 мс
|
||||
|
||||
// В основном цикле
|
||||
while (1) {
|
||||
GPIO_LED_Dynamic_Handle(&led);
|
||||
}
|
||||
@endcode
|
||||
|
||||
@subsubsection tim_example Пример работы с таймером
|
||||
|
||||
@code
|
||||
// Настройка таймера
|
||||
TIM_SettingsTypeDef tim_settings = {0};
|
||||
tim_settings.htim.Instance = TIM2;
|
||||
tim_settings.sTimAHBFreqMHz = SystemCoreClock;
|
||||
tim_settings.sTickBaseUS = TIM_TickBase_1MS;
|
||||
tim_settings.sTimFreqHz = 1000; // 1 кГц
|
||||
tim_settings.sTimMode = TIM_IT_CONF;
|
||||
|
||||
TIM_Base_Init(&tim_settings);
|
||||
HAL_TIM_Base_Start(&tim_settings.htim);
|
||||
@endcode
|
||||
|
||||
@subsection dependencies Зависимости
|
||||
|
||||
- HAL библиотека STM32
|
||||
- SEGGER RTT (опционально, для RTT трассировки)
|
||||
- FreeRTOS (опционально, для FreeRTOS задержек)
|
||||
*/
|
||||
#endif // __MYLIBS_INCLUDE_H_
|
||||
@@ -134,16 +134,22 @@
|
||||
|
||||
#define TrackerTypeDef(num_user_vars) void *
|
||||
|
||||
#define num_of_usercnts(_user_)
|
||||
#define assert_tracecnt(_cntstruct_, _uservarnumb_)
|
||||
#define num_of_usercnts(_user_) 0
|
||||
#define assert_tracecnt(_cntstruct_, _uservarnumb_) 0
|
||||
#define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(0)
|
||||
#define tern_assert_usertracker(_cntstruct_, _uservarnumb_) 0
|
||||
|
||||
#define TrackerGet_Ok(_cntstruct_) dummy
|
||||
#define TrackerGet_Err(_cntstruct_) dummy
|
||||
#define TrackerGet_Warn(_cntstruct_) dummy
|
||||
#define TrackerGet_User(_cntstruct_, _uservarnumb_) dummy
|
||||
|
||||
#define TrackerCnt_Ok(_cntstruct_)
|
||||
#define TrackerCnt_Err(_cntstruct_)
|
||||
#define TrackerCnt_Warn(_cntstruct_)
|
||||
#define TrackerCnt_User(_cntstruct_, _uservarnumb_)
|
||||
#define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
|
||||
#define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
|
||||
|
||||
/** @brief Очистка всей структуры */
|
||||
#define TrackerClear_All(_cntstruct_)
|
||||
#define TrackerClear_Ok(_cntstruct_)
|
||||
#define TrackerClear_Err(_cntstruct_)
|
||||
|
||||
Reference in New Issue
Block a user