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_
MyLibs
Inc
mylibs_defs.h
Generated by
1.14.0