MyLibs 1.0 Расширенные библиотеки для STM32

Loading...
Searching...
No Matches
mylibs_defs.h
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file mylibs_defs.h
4* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
5**************************************************************************
6* @defgroup MYLIBS_TOOLS General Tools
7* @ingroup MYLIBS_ALL
8* @brief Общие макросы и typedef'ы, используемые по всему проекту
9*
10* @defgroup MYLIBS_DEBUG_TOOLS Debug Tools
11* @ingroup MYLIBS_ALL
12* @brief Утилиты для тестирования программы
13*
14* @addtogroup BENCH_TIME
15* @ingroup MYLIBS_DEBUG_TOOLS
16*
17* @addtogroup GEN_OPTIMIZER
18* @ingroup MYLIBS_DEBUG_TOOLS
19*
20* @addtogroup TRACE
21* @ingroup MYLIBS_DEBUG_TOOLS
22*
23* @addtogroup TRACKERS
24* @ingroup MYLIBS_DEBUG_TOOLS
25*************************************************************************/
26#ifndef __MYLIBS_TOOLS_H_
27#define __MYLIBS_TOOLS_H_
28
29#include "mylibs_config.h"
30
31/***************************************************************************
32******************************ERROR_HANDLER********************************/
33/**
34 * @addtogroup ERROR_HANDLER_DEFINES Error Handler defines
35 * @ingroup MYLIBS_TOOLS
36 * @brief Дефайны для обработки ошибок
37 * @{
38 */
39
40/* extern Error_Handler from main.h */
41 extern void Error_Handler(void);
42
43/**
44 * @brief Error_Handler который будет вызыватся в библиотеке
45 */
46#define MyLibs_Error_Handler(params) Error_Handler(params)
47/* If error handler not defined - set void */
48#ifndef MyLibs_Error_Handler
49#define MyLibs_Error_Handler(...)
50#endif // MyLibs_Error_Handler
51
52/** @brief Проверить один указатель на NULL */
53#define check_null_ptr_1(p1) (p1 == NULL)
54
55/** @brief Проверить два указателя на NULL */
56#define check_null_ptr_2(p1, p2) ((p1 == NULL) || (p1 != NULL && p2 == NULL))
57
58/** @brief Проверить три указателя на NULL */
59#define check_null_ptr_3(p1, p2, p3) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
60
61/** @brief Проверить четыре указателя на NULL */
62#define check_null_ptr_4(p1, p2, p3, p4) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
63
64/** @brief Проверить пять указателей на NULL */
65#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))))))))
66
67/** ERROR_HANDLER_DEFINES
68 * @}
69 */
70
71
72/***************************************************************************
73******************************DELAYS_DEFINES*******************************/
74/**
75 * @addtogroup DELAYS_DEFINES Delays defines
76 * @ingroup MYLIBS_TOOLS
77 * @brief Макросы и определения для работы с задержками в миллисекундах.
78 * @details
79 * Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS:
80 * - @ref msDelay — простая задержка заданной длительности;
81 * - @ref msDelayStart — сохранение текущего времени начала задержки;
82 * - @ref msDelayWhileActive — проверка, активна ли задержка;
83 * - @ref msDelayWaitDone — проверка, завершена ли задержка.
84 * Эти макросы удобны для реализации неблокирующих задержек.
85 * @{
86 */
87
88/**
89 * @def msDelay(_ms_)
90 * @brief Блокирующая задержка на указанное количество миллисекунд.
91 * @param _ms_ Время задержки в миллисекундах.
92 * @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY.
93 */
94#ifdef FREERTOS_DELAY
95 #define msDelay(_ms_) osDelay(_ms_)
96#else
97 #define msDelay(_ms_) \
98 do { \
99 uint32_t _start_ = local_time(); \
100 while (local_time() - _start_ < (_ms_)) {} \
101 } while(0)
102#endif
103
104
105/**
106 * @brief Начать отсчет задержки.
107 * @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
108 * @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
109 * с момента запуска системы (@ref local_time).
110 *
111 * Используется для реализации неблокирующих задержек.
112 */
113#define msDelayStart(_pvar_) *(_pvar_) = local_time()
114
115/**
116 * @brief Проверяет, активна ли задержка.
117 * @param _ms_ Длительность задержки в миллисекундах.
118 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
119 * @retval 1 Задержка еще активна.
120 * @retval 0 Задержка завершена.
121 * @details
122 * Возвращает true, пока время задержки не истекло. Используется в проверках,
123 * когда нужно **действовать, пока задержка выполняется**. Пример:
124 * @code
125 * while(msDelayWhileActive(1000, &tick)) {
126 * // выполняем другие задачи, задержка не блокирует поток
127 * }
128 * @endcode
129 */
130#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_)
131
132/**
133 * @brief Проверяет, завершилась ли задержка.
134 * @param _ms_ Длительность задержки в миллисекундах.
135 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
136 * @retval 1 Задержка завершена.
137 * @retval 0 Задержка еще активна.
138 * @details
139 * Возвращает true, когда задержка уже завершена. Используется в проверках,
140 * когда нужно **выполнить действие только после окончания задержки**. Пример:
141 * @code
142 * if(msDelayWaitDone(1000, &tick)) {
143 * // выполняем действие после завершения задержки
144 * }
145 * @endcode
146 */
147#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_)
148
149/** DELAYS_DEFINES
150 * @}
151 */
152
153
154/***************************************************************************
155*******************************UTIL_DEFINES********************************/
156/**
157 * @addtogroup UTILS_DEFINES Utils defines
158 * @ingroup MYLIBS_TOOLS
159 * @brief Общие вспомогательные макросы
160 * @{
161 */
162
163/**
164 * @brief Обнуление структуры.
165 * @param _struct_ Структура, которую нужно обнулить.
166 * @details Макрос использует memset для обнуления всей памяти структуры.
167 * Используется для быстрой и безопасной инициализации переменных структур до нуля.
168 */
169#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_))
170
171/**
172 * @brief Деление с округлением вверх
173 * @param _val_ Делимое.
174 * @param _div_ Делитель.
175 * @return Результат деления, округленный вверх.
176 * @details Если результат деления без остатка: он возвращается как есть
177 Если с остатком - округляется вверх
178 */
179//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
180#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
181
182/**
183 * @brief Swap between Little Endian and Big Endian
184 * @param v Исходное 16-битное значение.
185 * @return Результат с поменяными местами старшим и младшим байтом.
186 * @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
187 */
188#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
189
190/**
191 * @brief Абсолютное значение числа
192 * @param x Число.
193 * @return Абсолютное значение числа x.
194 * @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
195 */
196#define ABS(x) ( ((x) > 0)? (x) : -(x))
197
198/** UTILS_DEFINES
199 * @}
200 */
201
202
203
204/**
205 * @cond LIBS_INTERNAL
206 */
207
208 static int dummy; // переменная которой присваиваются значения, которые некуда присвоить
209
210/**
211 * @brief Аналог HAL макроса для привязки DMA к UART.
212 * @note @ref __HAL_LINKDMA.
213 */
214#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
215 do{ \
216(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
217(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
218
219
220/** @endcond */
221#endif //__MYLIBS_TOOLS_H_