- MyLibs - максимально платформонезависимые библиотеки (кроме разве что RTT) - RTT - STM32_General - библиотеки для периферии stm32
		
			
				
	
	
		
			163 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** 
 | 
						||
**************************************************************************
 | 
						||
* @file trackers.h
 | 
						||
* @brief Заголочный файл для работы с трекерами @ref TRACKERS.
 | 
						||
**************************************************************************
 | 
						||
* @addtogroup TRACKERS        Trackers defines
 | 
						||
* @ingroup    MYLIBS_DEFINES
 | 
						||
* @brief      Дефайны для работы с трекерами
 | 
						||
* @details    
 | 
						||
Есть дефайн для объявления структуры трекера: TrackerTypeDef(num_user_vars). 
 | 
						||
Структура состоит из следующих элементов: 
 | 
						||
- cnt_ok
 | 
						||
- cnt_err
 | 
						||
- cnt_warn
 | 
						||
- user[num_user_vars]    
 | 
						||
Также есть ряд функций (дефайнов) для обращения к элементам этой структуры.
 | 
						||
 | 
						||
Параметры для конфигурации:
 | 
						||
- @ref TRACKERS_ENABLE - Включить трекеры
 | 
						||
  Если трекеры @ref TRACKERS_ENABLE отключены, то все дефайны определяются как ничего 
 | 
						||
  и на производительность кода не влияют  
 | 
						||
 | 
						||
@par Пример:
 | 
						||
 | 
						||
Определяем typedef трекера измерений Measure_TrackerTypeDef
 | 
						||
 | 
						||
@verbatim
 | 
						||
  typedef TrackerTypeDef(MEASURE_USER_VARS_NUMB) Measure_TrackerTypeDef;
 | 
						||
@endverbatim
 | 
						||
 | 
						||
И через @ref Measure_TrackerTypeDef структура подключается в другие структуры
 | 
						||
 | 
						||
Для работы с структурой можно использовать функции:
 | 
						||
- Для получения значения:
 | 
						||
  - TrackerGet_Ok()
 | 
						||
  - TrackerGet_Err()
 | 
						||
  - TrackerGet_Warn()
 | 
						||
  - TrackerGet_User(n)
 | 
						||
  
 | 
						||
- Для записи значения:
 | 
						||
  - TrackerCnt_Ok()
 | 
						||
  - TrackerCnt_Err()
 | 
						||
  - TrackerCnt_Warn()
 | 
						||
  - TrackerCnt_User()
 | 
						||
  - TrackerWrite_User(n)
 | 
						||
  
 | 
						||
- Для очищения значения:
 | 
						||
  - TrackerClear_All()
 | 
						||
  - TrackerClear_Ok()
 | 
						||
  - TrackerClear_Err()
 | 
						||
  - TrackerClear_Warn()
 | 
						||
  - TrackerClear_User(n)
 | 
						||
  - TrackerClear_UserAll()
 | 
						||
* @{  
 | 
						||
*************************************************************************/
 | 
						||
#ifndef __TRACKERS_H_
 | 
						||
#define __TRACKERS_H_
 | 
						||
#include "mylibs_defs.h"
 | 
						||
 | 
						||
#ifdef TRACKERS_ENABLE
 | 
						||
  /** 
 | 
						||
    * @brief Структура для счетчиков отладки
 | 
						||
    * @param num_user_vars - количество пользовательских переменных
 | 
						||
    * @details Содержит счетчик для успешных событый (cnt_ok),
 | 
						||
    * счетчик для ошибок (cnt_err), счетчик для предупреждений (cnt_warn).
 | 
						||
    *
 | 
						||
    * Также есть возможность объявить пользовательские переменные в 
 | 
						||
    * количестве <num_user_vars> штук.
 | 
						||
    */
 | 
						||
  #define TrackerTypeDef(num_user_vars)       \
 | 
						||
  struct                                      \
 | 
						||
  {                                           \
 | 
						||
    uint32_t cnt_ok;                          \
 | 
						||
    uint32_t cnt_err;                         \
 | 
						||
    uint32_t cnt_warn;                        \
 | 
						||
    uint32_t user[num_user_vars];             \
 | 
						||
  }
 | 
						||
 | 
						||
  /** @brief Получить количетство пользовательских переменных */
 | 
						||
  #define num_of_usercnts(_user_)                               (sizeof(_user_) / sizeof(uint32_t))
 | 
						||
  /** @brief Проверка существует ли указанная пользовательская переменная */
 | 
						||
  #define assert_usertracker(_cntstruct_, _uservarnumb_)        ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user))
 | 
						||
  /** @brief Условие для проверки существует ли указанная пользовательская переменная */
 | 
						||
  #define if_assert_usertracker(_cntstruct_, _uservarnumb_)     if(assert_usertracker(_cntstruct_, _uservarnumb_))
 | 
						||
  /** @brief Тернарный оператор для проверки существует ли указанная пользовательская переменная */
 | 
						||
  #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)   (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0
 | 
						||
 | 
						||
  
 | 
						||
  /** @brief Считать счетчик успешных событий */
 | 
						||
  #define TrackerGet_Ok(_cntstruct_)                              (_cntstruct_).cnt_ok
 | 
						||
  /** @brief Считать счетчик ошибок */
 | 
						||
  #define TrackerGet_Err(_cntstruct_)                             (_cntstruct_).cnt_err
 | 
						||
  /** @brief Считать счетчик предупреждений */
 | 
						||
  #define TrackerGet_Warn(_cntstruct_)                            (_cntstruct_).cnt_warn
 | 
						||
  /** 
 | 
						||
    * @brief Считать пользовательскую переменную 
 | 
						||
    * @note   Здесь нет проверки - существует ли пользовательская переменная! 
 | 
						||
    *         Есть возможность выйти за границы структуры!!! 
 | 
						||
    *         Чтобы этого избежать можно использовать дефайн #ref assert_usertracker()
 | 
						||
    @verbatim   
 | 
						||
      if(assert_usertracker(struct, 0)) {
 | 
						||
          TrackerGet_User(struct, 0)
 | 
						||
      }
 | 
						||
    @endverbatim
 | 
						||
    */
 | 
						||
  #define TrackerGet_User(_cntstruct_, _uservarnumb_)             (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)]
 | 
						||
  
 | 
						||
  
 | 
						||
  
 | 
						||
  /** @brief Инкрементирование счетчика успешных событий */
 | 
						||
  #define TrackerCnt_Ok(_cntstruct_)                              (_cntstruct_).cnt_ok++
 | 
						||
  /** @brief Инкрементирование счетчика ошибок */
 | 
						||
  #define TrackerCnt_Err(_cntstruct_)                             (_cntstruct_).cnt_err++
 | 
						||
  /** @brief Инкрементирование счетчика предупреждений */
 | 
						||
  #define TrackerCnt_Warn(_cntstruct_)                            (_cntstruct_).cnt_warn++
 | 
						||
  /** @brief Инкрементирование пользовательской переменной */
 | 
						||
  #define TrackerCnt_User(_cntstruct_, _uservarnumb_)             if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++;
 | 
						||
  /** @brief Запись числа в пользовательскую переменную */
 | 
						||
  #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)    if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_)
 | 
						||
 | 
						||
  /** @brief Очистка всей структуры */
 | 
						||
  #define TrackerClear_All(_cntstruct_)                           memset(&(_cntstruct_), 0, sizeof(_cntstruct_))
 | 
						||
  /** @brief Очистка счетчика успешных событий */
 | 
						||
  #define TrackerClear_Ok(_cntstruct_)                            (_cntstruct_).cnt_ok = 0
 | 
						||
  /** @brief Очистка счетчика ошибок */
 | 
						||
  #define TrackerClear_Err(_cntstruct_)                           (_cntstruct_).cnt_err = 0
 | 
						||
  /** @brief Очистка счетчика предупреждений */
 | 
						||
  #define TrackerClear_Warn(_cntstruct_)                          (_cntstruct_).cnt_warn = 0
 | 
						||
  /** @brief Очистка пользовательской переменной */
 | 
						||
  #define TrackerClear_User(_cntstruct_, _uservarnumb_)           if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0;
 | 
						||
  /** @brief Очистка всех пользовательских переменных */
 | 
						||
  #define TrackerClear_UserAll(_cntstruct_)                       memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user))
 | 
						||
 | 
						||
#else //TRACKERS_ENABLE
 | 
						||
  
 | 
						||
  #define TrackerTypeDef(num_user_vars) void *
 | 
						||
 | 
						||
  #define num_of_usercnts(_user_)                               0
 | 
						||
  #define assert_tracecnt(_cntstruct_, _uservarnumb_)           0
 | 
						||
  #define if_assert_usertracker(_cntstruct_, _uservarnumb_)     if(0)
 | 
						||
  #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)   0
 | 
						||
 | 
						||
  #define TrackerGet_Ok(_cntstruct_)                            dummy
 | 
						||
  #define TrackerGet_Err(_cntstruct_)                           dummy
 | 
						||
  #define TrackerGet_Warn(_cntstruct_)                          dummy 
 | 
						||
  #define TrackerGet_User(_cntstruct_, _uservarnumb_)           dummy
 | 
						||
  
 | 
						||
  #define TrackerCnt_Ok(_cntstruct_)                              
 | 
						||
  #define TrackerCnt_Err(_cntstruct_)                             
 | 
						||
  #define TrackerCnt_Warn(_cntstruct_)                            
 | 
						||
  #define TrackerCnt_User(_cntstruct_, _uservarnumb_)                 
 | 
						||
  #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
 | 
						||
 | 
						||
  #define TrackerClear_All(_cntstruct_)                        
 | 
						||
  #define TrackerClear_Ok(_cntstruct_)                         
 | 
						||
  #define TrackerClear_Err(_cntstruct_)                        
 | 
						||
  #define TrackerClear_Warn(_cntstruct_)                       
 | 
						||
  #define TrackerClear_User(_cntstruct_)                       
 | 
						||
  #define TrackerClear_UserAll(_cntstruct_)                    
 | 
						||
 | 
						||
#endif //TRACKERS_ENABLE
 | 
						||
  
 | 
						||
#endif //__TRACKERS_H_
 |