MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
trackers.h
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file trackers.h
4* @brief Заголочный файл для работы с трекерами @ref TRACKERS.
5**************************************************************************
6* @addtogroup TRACKERS Trackers defines
7* @ingroup MYLIBS_DEFINES
8* @brief Дефайны для работы с трекерами
9* @details
10Есть дефайн для объявления структуры трекера: TrackerTypeDef(num_user_vars).
11Структура состоит из следующих элементов:
12- cnt_ok
13- cnt_err
14- cnt_warn
15- user[num_user_vars]
16Также есть ряд функций (дефайнов) для обращения к элементам этой структуры.
17
18Параметры для конфигурации:
19- @ref TRACKERS_ENABLE - Включить трекеры
20 Если трекеры @ref TRACKERS_ENABLE отключены, то все дефайны определяются как ничего
21 и на производительность кода не влияют
22
23@par Пример:
24
25Определяем typedef трекера измерений Measure_TrackerTypeDef
26
27@verbatim
28 typedef TrackerTypeDef(MEASURE_USER_VARS_NUMB) Measure_TrackerTypeDef;
29@endverbatim
30
31И через @ref Measure_TrackerTypeDef структура подключается в другие структуры
32
33Для работы с структурой можно использовать функции:
34- Для получения значения:
35 - TrackerGet_Ok()
36 - TrackerGet_Err()
37 - TrackerGet_Warn()
38 - TrackerGet_User(n)
39
40- Для записи значения:
41 - TrackerCnt_Ok()
42 - TrackerCnt_Err()
43 - TrackerCnt_Warn()
44 - TrackerCnt_User()
45 - TrackerWrite_User(n)
46
47- Для очищения значения:
48 - TrackerClear_All()
49 - TrackerClear_Ok()
50 - TrackerClear_Err()
51 - TrackerClear_Warn()
52 - TrackerClear_User(n)
53 - TrackerClear_UserAll()
54* @{
55*************************************************************************/
56#ifndef __TRACKERS_H_
57#define __TRACKERS_H_
58#include "mylibs_defs.h"
59
60#ifdef TRACKERS_ENABLE
61 /**
62 * @brief Структура для счетчиков отладки
63 * @param num_user_vars - количество пользовательских переменных
64 * @details Содержит счетчик для успешных событый (cnt_ok),
65 * счетчик для ошибок (cnt_err), счетчик для предупреждений (cnt_warn).
66 *
67 * Также есть возможность объявить пользовательские переменные в
68 * количестве <num_user_vars> штук.
69 */
70 #define TrackerTypeDef(num_user_vars) \
71 struct \
72 { \
73 uint32_t cnt_ok; \
74 uint32_t cnt_err; \
75 uint32_t cnt_warn; \
76 uint32_t user[num_user_vars]; \
77 }
78
79 /** @brief Получить количетство пользовательских переменных */
80 #define num_of_usercnts(_user_) (sizeof(_user_) / sizeof(uint32_t))
81 /** @brief Проверка существует ли указанная пользовательская переменная */
82 #define assert_usertracker(_cntstruct_, _uservarnumb_) ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user))
83 /** @brief Условие для проверки существует ли указанная пользовательская переменная */
84 #define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(assert_usertracker(_cntstruct_, _uservarnumb_))
85 /** @brief Тернарный оператор для проверки существует ли указанная пользовательская переменная */
86 #define tern_assert_usertracker(_cntstruct_, _uservarnumb_) (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0
87
88
89 /** @brief Считать счетчик успешных событий */
90 #define TrackerGet_Ok(_cntstruct_) (_cntstruct_).cnt_ok
91 /** @brief Считать счетчик ошибок */
92 #define TrackerGet_Err(_cntstruct_) (_cntstruct_).cnt_err
93 /** @brief Считать счетчик предупреждений */
94 #define TrackerGet_Warn(_cntstruct_) (_cntstruct_).cnt_warn
95 /**
96 * @brief Считать пользовательскую переменную
97 * @note Здесь нет проверки - существует ли пользовательская переменная!
98 * Есть возможность выйти за границы структуры!!!
99 * Чтобы этого избежать можно использовать дефайн #ref assert_usertracker()
100 @verbatim
101 if(assert_usertracker(struct, 0)) {
102 TrackerGet_User(struct, 0)
103 }
104 @endverbatim
105 */
106 #define TrackerGet_User(_cntstruct_, _uservarnumb_) (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)]
107
108
109
110 /** @brief Инкрементирование счетчика успешных событий */
111 #define TrackerCnt_Ok(_cntstruct_) (_cntstruct_).cnt_ok++
112 /** @brief Инкрементирование счетчика ошибок */
113 #define TrackerCnt_Err(_cntstruct_) (_cntstruct_).cnt_err++
114 /** @brief Инкрементирование счетчика предупреждений */
115 #define TrackerCnt_Warn(_cntstruct_) (_cntstruct_).cnt_warn++
116 /** @brief Инкрементирование пользовательской переменной */
117 #define TrackerCnt_User(_cntstruct_, _uservarnumb_) if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++;
118 /** @brief Запись числа в пользовательскую переменную */
119 #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_) if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_)
120
121 /** @brief Очистка всей структуры */
122 #define TrackerClear_All(_cntstruct_) memset(&(_cntstruct_), 0, sizeof(_cntstruct_))
123 /** @brief Очистка счетчика успешных событий */
124 #define TrackerClear_Ok(_cntstruct_) (_cntstruct_).cnt_ok = 0
125 /** @brief Очистка счетчика ошибок */
126 #define TrackerClear_Err(_cntstruct_) (_cntstruct_).cnt_err = 0
127 /** @brief Очистка счетчика предупреждений */
128 #define TrackerClear_Warn(_cntstruct_) (_cntstruct_).cnt_warn = 0
129 /** @brief Очистка пользовательской переменной */
130 #define TrackerClear_User(_cntstruct_, _uservarnumb_) if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0;
131 /** @brief Очистка всех пользовательских переменных */
132 #define TrackerClear_UserAll(_cntstruct_) memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user))
133
134#else //TRACKERS_ENABLE
135
136 #define TrackerTypeDef(num_user_vars) void *
137
138 #define num_of_usercnts(_user_) 0
139 #define assert_tracecnt(_cntstruct_, _uservarnumb_) 0
140 #define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(0)
141 #define tern_assert_usertracker(_cntstruct_, _uservarnumb_) 0
142
143 #define TrackerGet_Ok(_cntstruct_) dummy
144 #define TrackerGet_Err(_cntstruct_) dummy
145 #define TrackerGet_Warn(_cntstruct_) dummy
146 #define TrackerGet_User(_cntstruct_, _uservarnumb_) dummy
147
148 #define TrackerCnt_Ok(_cntstruct_)
149 #define TrackerCnt_Err(_cntstruct_)
150 #define TrackerCnt_Warn(_cntstruct_)
151 #define TrackerCnt_User(_cntstruct_, _uservarnumb_)
152 #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
153
154 #define TrackerClear_All(_cntstruct_)
155 #define TrackerClear_Ok(_cntstruct_)
156 #define TrackerClear_Err(_cntstruct_)
157 #define TrackerClear_Warn(_cntstruct_)
158 #define TrackerClear_User(_cntstruct_)
159 #define TrackerClear_UserAll(_cntstruct_)
160
161#endif //TRACKERS_ENABLE
162
163#endif //__TRACKERS_H_
Заголочный файл для дефайнов библиотеки MyLibsGeneral.