#ifndef DEBUG_TOOLS #define DEBUG_TOOLS #include #include //#if (LONG_MAX != 2147483647L) //# error "debug_tools: this code assumes 32-bit long. Please update DebugValue_t typedef." //#endif #if defined(uint8_t) && defined(int8_t) // Если есть тип 8 бит - знчачит адресация по 8 бит #define ALIGN_8BIT 0x0 ///< Выравнивание без ограничений (любой адрес) #define ALIGN_16BIT 0x1 ///< Выравнивание: адрес должен быть кратен 2 (addr & 0x1 == 0) #define ALIGN_32BIT 0x3 ///< Выравнивание: адрес должен быть кратен 4 (addr & 0x3 == 0) #define ALIGN_64BIT 0x7 ///< Выравнивание: адрес должен быть кратен 8 (addr & 0x7 == 0) #define ALIGN_FLOAT ALIGN_32BIT #else // Если нет типа 8 бит - значит адресация по 16 бит #define ALIGN_8BIT 0x0 ///< Выравнивание без ограничений (любой адрес) #define ALIGN_16BIT 0x0 ///< Выравнивание без ограничений (любой адрес) #define ALIGN_32BIT 0x1 ///< Выравнивание: адрес должен быть кратен 4 (addr & 0x1 == 0) #define ALIGN_64BIT 0x3 ///< Выравнивание: адрес должен быть кратен 8 (addr & 0x3 == 0) #define ALIGN_FLOAT ALIGN_32BIT #endif //STM32/TMS32 #if !defined(uint8_t) typedef unsigned char uint8_t; #endif #if !defined(int8_t) typedef signed char int8_t; #endif #if !defined(NULL) #define NULL 0 #endif #if !defined(NULL) #define NULL 0 #endif /** * @brief Тип данных, на который указывает указатель переменной отладки. */ typedef enum { pt_unknown, // unknown pt_int8, // signed char pt_int16, // int pt_int32, // long pt_int64, // long pt_uint8, // unsigned char pt_uint16, // unsigned int pt_uint32, // unsigned long pt_uint64, // unsigned long pt_float, // floatf pt_struct, // struct pt_union, // struct // pt_ptr_int8, // signed char* // pt_ptr_int16, // int* // pt_ptr_int32, // long* // pt_ptr_uint8, // unsigned char* // pt_ptr_uint16, // unsigned int* // pt_ptr_uint32, // unsigned long* // pt_arr_int8, // signed char[] // pt_arr_int16, // int[] // pt_arr_int32, // long[] // pt_arr_uint8, // unsigned char[] // pt_arr_uint16, // unsigned int[] // pt_arr_uint32, // unsigned long[] }DebugVarPtrType_t; /** * @brief Типы IQ-представления переменной отладки. */ typedef enum { t_iq_none, t_iq, t_iq1, t_iq2, t_iq3, t_iq4, t_iq5, t_iq6, t_iq7, t_iq8, t_iq9, t_iq10, t_iq11, t_iq12, t_iq13, t_iq14, t_iq15, t_iq16, t_iq17, t_iq18, t_iq19, t_iq20, t_iq21, t_iq22, t_iq23, t_iq24, t_iq25, t_iq26, t_iq27, t_iq28, t_iq29, t_iq30 }DebugVarIQType_t; typedef char DebugVarName_t[11]; ///< Имя переменной отладки (до 10 символов + \0) /** * @brief Описание переменной отладки. */ typedef struct { uint8_t* Ptr; ///< Указатель на значение переменной DebugVarPtrType_t ptr_type; ///< Тип значения DebugVarIQType_t iq_type; ///< Тип IQ переменной (если есть) DebugVarIQType_t return_type;///< Тип IQ возвращаемого значения DebugVarName_t name; ///< Имя переменной } DebugVar_t; typedef long DebugValue_t; /** * @brief Структура даты и времени. */ typedef struct { uint16_t year; ///< Год (например, 2025) uint8_t month; ///< Месяц (1-12) uint8_t day; ///< День (1-31) uint8_t hour; ///< Часы (0-23) uint8_t minute; ///< Минуты (0-59) } DateTime_t; /** * @brief Структура нижнего уровня отладки. */ typedef struct { DateTime_t build_date; ///< Дата сборки unsigned int isVerified; ///< Флаг инициализации низкоуровненой отладки (0 — нет, 1 — успешно) DebugVar_t dbg_var; ///< Переменная для отладки }DebugLowLevel_t; extern DebugLowLevel_t debug_ll; ///< Глобальный экземпляр отладки нижнего уровня /** @brief Макрос инициализации даты */ #define DATE_INIT {BUILD_YEAR, BUILD_MONTH, BUILD_DATA, BUILD_HOURS, BUILD_MINUTES} /** @brief Макрос инициализации переменной отладки */ #define DEBUG_VAR_INIT {0, pt_uint16, t_iq_none, t_iq_none, "\0"} /** @brief Макрос инициализации нижнего уровня отладки */ #define DEBUG_LOWLEVEL_INIT {DATE_INIT, 0, DEBUG_VAR_INIT} extern int DebugVar_Qnt; ///< Количество переменных отладки extern DebugVar_t dbg_vars[]; ///< Массив переменных отладки /* Пример использования отладки */ void Debug_Test_Example(void); /* Читает значение переменной по индексу */ int Debug_ReadVar(int var_ind, int32_t *return_long); /* Читает имя переменной по индексу */ int Debug_ReadVarName(int var_ind, DebugVarName_t name_ptr); /* Читает значение переменной с нижнего уровня */ int Debug_LowLevel_ReadVar(int32_t *return_long); /* Инициализирует отладку нижнего уровня */ int Debug_LowLevel_Initialize(DateTime_t *external_date); #endif //DEBUG_TOOLS