- MyLibs - максимально платформонезависимые библиотеки (кроме разве что RTT) - RTT - STM32_General - библиотеки для периферии stm32
206 lines
9.3 KiB
C
206 lines
9.3 KiB
C
/**
|
||
**************************************************************************
|
||
* @file mylibs_defs.h
|
||
* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
|
||
**************************************************************************
|
||
* @defgroup MYLIBS_DEFINES General Tools
|
||
* @ingroup MYLIBS_ALL
|
||
* @brief Общие макросы и typedef'ы, используемые по всему проекту
|
||
*
|
||
*************************************************************************/
|
||
#ifndef __MYLIBS_DEFINES_H_
|
||
#define __MYLIBS_DEFINES_H_
|
||
|
||
#include "mylibs_config.h"
|
||
|
||
/***************************************************************************
|
||
******************************ERROR_HANDLER********************************/
|
||
/**
|
||
* @addtogroup ERROR_HANDLER_DEFINES Error Handler defines
|
||
* @ingroup MYLIBS_DEFINES
|
||
* @brief Дефайны для обработки ошибок
|
||
* @{
|
||
*/
|
||
|
||
/* extern Error_Handler from main.h */
|
||
extern void Error_Handler(void);
|
||
|
||
/**
|
||
* @brief Error_Handler который будет вызыватся в библиотеке
|
||
*/
|
||
#define MyLibs_Error_Handler(params) Error_Handler(params)
|
||
/* If error handler not defined - set void */
|
||
#ifndef MyLibs_Error_Handler
|
||
#define MyLibs_Error_Handler(...)
|
||
#endif // MyLibs_Error_Handler
|
||
|
||
/** @brief Проверить один указатель на NULL */
|
||
#define check_null_ptr_1(p1) (p1 == NULL)
|
||
|
||
/** @brief Проверить два указателя на NULL */
|
||
#define check_null_ptr_2(p1, p2) ((p1 == NULL) || (p1 != NULL && p2 == NULL))
|
||
|
||
/** @brief Проверить три указателя на NULL */
|
||
#define check_null_ptr_3(p1, p2, p3) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
|
||
|
||
/** @brief Проверить четыре указателя на NULL */
|
||
#define check_null_ptr_4(p1, p2, p3, p4) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
|
||
|
||
/** @brief Проверить пять указателей на NULL */
|
||
#define check_null_ptr_5(p1, p2, p3, p4, p5) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL))))))))
|
||
|
||
/** ERROR_HANDLER_DEFINES
|
||
* @}
|
||
*/
|
||
|
||
|
||
/***************************************************************************
|
||
******************************DELAYS_DEFINES*******************************/
|
||
/**
|
||
* @addtogroup DELAYS_DEFINES Delays defines
|
||
* @ingroup MYLIBS_DEFINES
|
||
* @brief Макросы и определения для работы с задержками в миллисекундах.
|
||
* @details
|
||
* Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS:
|
||
* - @ref msDelay — простая задержка заданной длительности;
|
||
* - @ref msDelayStart — сохранение текущего времени начала задержки;
|
||
* - @ref msDelayWhileActive — проверка, активна ли задержка;
|
||
* - @ref msDelayWaitDone — проверка, завершена ли задержка.
|
||
* Эти макросы удобны для реализации неблокирующих задержек.
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @def msDelay(_ms_)
|
||
* @brief Блокирующая задержка на указанное количество миллисекунд.
|
||
* @param _ms_ Время задержки в миллисекундах.
|
||
* @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY.
|
||
*/
|
||
#ifdef FREERTOS_DELAY
|
||
#define msDelay(_ms_) osDelay(_ms_)
|
||
#else
|
||
#define msDelay(_ms_) \
|
||
do { \
|
||
uint32_t _start_ = local_time(); \
|
||
while (local_time() - _start_ < (_ms_)) {} \
|
||
} while(0)
|
||
#endif
|
||
|
||
|
||
/**
|
||
* @brief Начать отсчет задержки.
|
||
* @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
|
||
* @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
|
||
* с момента запуска системы (@ref local_time).
|
||
*
|
||
* Используется для реализации неблокирующих задержек.
|
||
*/
|
||
#define msDelayStart(_pvar_) *(_pvar_) = local_time()
|
||
|
||
/**
|
||
* @brief Проверяет, активна ли задержка.
|
||
* @param _ms_ Длительность задержки в миллисекундах.
|
||
* @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
|
||
* @retval 1 Задержка еще активна.
|
||
* @retval 0 Задержка завершена.
|
||
* @details
|
||
* Возвращает true, пока время задержки не истекло. Используется в проверках,
|
||
* когда нужно **действовать, пока задержка выполняется**. Пример:
|
||
* @code
|
||
* while(msDelayWhileActive(1000, &tick)) {
|
||
* // выполняем другие задачи, задержка не блокирует поток
|
||
* }
|
||
* @endcode
|
||
*/
|
||
#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_)
|
||
|
||
/**
|
||
* @brief Проверяет, завершилась ли задержка.
|
||
* @param _ms_ Длительность задержки в миллисекундах.
|
||
* @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
|
||
* @retval 1 Задержка завершена.
|
||
* @retval 0 Задержка еще активна.
|
||
* @details
|
||
* Возвращает true, когда задержка уже завершена. Используется в проверках,
|
||
* когда нужно **выполнить действие только после окончания задержки**. Пример:
|
||
* @code
|
||
* if(msDelayWaitDone(1000, &tick)) {
|
||
* // выполняем действие после завершения задержки
|
||
* }
|
||
* @endcode
|
||
*/
|
||
#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_)
|
||
|
||
/** DELAYS_DEFINES
|
||
* @}
|
||
*/
|
||
|
||
|
||
/***************************************************************************
|
||
*******************************UTIL_DEFINES********************************/
|
||
static int dummy;
|
||
/**
|
||
* @addtogroup UTILS_DEFINES Utils defines
|
||
* @ingroup MYLIBS_DEFINES
|
||
* @brief Общие вспомогательные макросы
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @brief Обнуление структуры.
|
||
* @param _struct_ Структура, которую нужно обнулить.
|
||
* @details Макрос использует memset для обнуления всей памяти структуры.
|
||
* Используется для быстрой и безопасной инициализации переменных структур до нуля.
|
||
*/
|
||
#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_))
|
||
|
||
/**
|
||
* @brief Деление с округлением вверх
|
||
* @param _val_ Делимое.
|
||
* @param _div_ Делитель.
|
||
* @return Результат деления, округленный вверх.
|
||
* @details Если результат деления без остатка: он возвращается как есть
|
||
Если с остатком - округляется вверх
|
||
*/
|
||
//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
|
||
#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
|
||
|
||
/**
|
||
* @brief Swap between Little Endian and Big Endian
|
||
* @param v Исходное 16-битное значение.
|
||
* @return Результат с поменяными местами старшим и младшим байтом.
|
||
* @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
|
||
*/
|
||
#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
|
||
|
||
/**
|
||
* @brief Абсолютное значение числа
|
||
* @param x Число.
|
||
* @return Абсолютное значение числа x.
|
||
* @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
|
||
*/
|
||
#define ABS(x) ( ((x) > 0)? (x) : -(x))
|
||
|
||
/** UTILS_DEFINES
|
||
* @}
|
||
*/
|
||
|
||
|
||
|
||
/**
|
||
* @cond LIBS_INTERNAL
|
||
*/
|
||
|
||
|
||
/**
|
||
* @brief Аналог HAL макроса для привязки DMA к UART.
|
||
* @note @ref __HAL_LINKDMA.
|
||
*/
|
||
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
|
||
do{ \
|
||
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
|
||
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
|
||
|
||
|
||
/** @endcond */
|
||
#endif //__MYLIBS_DEFINES_H_
|