From 457ec2a7296c3606d6cc0fb6fa32dad7c10e6a02 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 25 Dec 2025 10:34:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D1=84=D0=B0=D0=B9=D0=BD=D1=8B=20ms?= =?UTF-8?q?=20=D0=97=D0=B0=D0=B4=D0=B5=D1=80=D0=B6=D0=B5=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=20static=20inline=20=D0=B8=20=D0=98=D0=97=D0=9C?= =?UTF-8?q?=D0=95=D0=9D=D0=95=D0=9D=D0=9E=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MyLibs/Inc/mylibs_defs.h | 44 ++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/MyLibs/Inc/mylibs_defs.h b/MyLibs/Inc/mylibs_defs.h index c4f744d..fa60061 100644 --- a/MyLibs/Inc/mylibs_defs.h +++ b/MyLibs/Inc/mylibs_defs.h @@ -79,8 +79,8 @@ extern void Error_Handler(void); * Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS: * - @ref msDelay — простая задержка заданной длительности; * - @ref msDelayStart — сохранение текущего времени начала задержки; - * - @ref msDelayWhileActive — проверка, активна ли задержка; - * - @ref msDelayWaitDone — проверка, завершена ли задержка. + * - @ref msDelayActive — проверка, активна ли задержка; + * - @ref msDelayDone — проверка, завершена ли задержка. * Эти макросы удобны для реализации неблокирующих задержек. * @{ */ @@ -92,13 +92,18 @@ extern void Error_Handler(void); * @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY. */ #ifdef FREERTOS_DELAY - #define msDelay(_ms_) osDelay(_ms_) +__STATIC_INLINE void msDelay(uint32_t _ms_) +{ + osDelay(_ms_); +} #else - #define msDelay(_ms_) \ - do { \ - uint32_t _start_ = local_time(); \ - while (local_time() - _start_ < (_ms_)) {} \ - } while(0) +__STATIC_INLINE void msDelay(uint32_t _ms_) +{ + volatile uint32_t _start_ = local_time(); + while ((local_time() - _start_) < (_ms_)) + { + } +} #endif @@ -110,7 +115,10 @@ extern void Error_Handler(void); * * Используется для реализации неблокирующих задержек. */ -#define msDelayStart(_pvar_) *(_pvar_) = local_time() +__STATIC_INLINE void msDelayStart(uint32_t *_pvar_) +{ + *(_pvar_) = local_time(); +} /** * @brief Проверяет, активна ли задержка. @@ -119,15 +127,18 @@ extern void Error_Handler(void); * @retval 1 Задержка еще активна. * @retval 0 Задержка завершена. * @details - * Возвращает true, пока время задержки не истекло. Используется в проверках, + * Возвращает true, пока задержка активна. Используется в проверках, * когда нужно **действовать, пока задержка выполняется**. Пример: * @code - * while(msDelayWhileActive(1000, &tick)) { + * while(msDelayActive(1000, &tick)) { * // выполняем другие задачи, задержка не блокирует поток * } * @endcode */ -#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_) +__STATIC_INLINE int msDelayActive(uint32_t _ms_, uint32_t *_pvar_) +{ + return (local_time() - *(_pvar_) < _ms_); +} /** * @brief Проверяет, завершилась ли задержка. @@ -136,15 +147,18 @@ extern void Error_Handler(void); * @retval 1 Задержка завершена. * @retval 0 Задержка еще активна. * @details - * Возвращает true, когда задержка уже завершена. Используется в проверках, + * Возвращает true, когда задержка закончилась. Используется в проверках, * когда нужно **выполнить действие только после окончания задержки**. Пример: * @code - * if(msDelayWaitDone(1000, &tick)) { + * if(msDelayDone(1000, &tick)) { * // выполняем действие после завершения задержки * } * @endcode */ -#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_) +__STATIC_INLINE int msDelayDone(uint32_t _ms_, uint32_t *_pvar_) +{ + return (local_time() - *(_pvar_) >= _ms_); +} /** DELAYS_DEFINES * @}