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 * @}