#ifndef DEBUG_TOOLS #define DEBUG_TOOLS #include #include #define ALLOWED_ADDRESS_RANGES { \ {0x000000, 0x0007FF}, \ {0x008120, 0x009FFC}, \ {0x3F8000, 0x3F9FFF}, \ {0x3FF000, 0x3FFFFF}, \ {0x080002, 0x09FFFF}, \ {0x0F0000, 0x0FFEFF}, \ {0x100002, 0x103FFF}, \ {0x102000, 0x103FFF} \ } #if UINT8_MAX // Если есть тип 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 !UINT8_MAX typedef unsigned char uint8_t; typedef signed char int8_t; #endif #if !defined(NULL) #define NULL 0 #endif #define DEBUG_SIGNED_VAR (1<<7) #define DEBUG_OK (0) #define DEBUG_ERR (1<<7) #define DEBUG_ERR_VAR_NUMB (1<<0) | DEBUG_ERR #define DEBUG_ERR_INVALID_VAR (1<<1) | DEBUG_ERR #define DEBUG_ERR_ADDR (1<<2) | DEBUG_ERR #define DEBUG_ERR_ADDR_ALIGN (1<<3) | DEBUG_ERR #define DEBUG_ERR_INTERNAL (1<<4) | DEBUG_ERR #define DEBUG_ERR_DATATIME (1<<5) | DEBUG_ERR #define DEBUG_ERR_RS (1<<6) | DEBUG_ERR /** * @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 { uint32_t start; ///< Начальный адрес диапазона uint32_t end; ///< Конечный адрес диапазона (включительно) } AddrRange_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 *length); /* Читает возвращаемый тип (IQ) переменной по индексу */ int Debug_ReadVarReturnType(int var_ind, int *vartype); /* Читает тип переменной по индексу */ int Debug_ReadVarType(int var_ind, int *vartype); /* Читает значение переменной с нижнего уровня */ int Debug_LowLevel_ReadVar(int32_t *return_long); /* Инициализирует отладку нижнего уровня */ int Debug_LowLevel_Initialize(DateTime_t *external_date); /* Читает возвращаемый тип (IQ) низкоуровнено заданной переменной */ int Debug_LowLevel_ReadVarReturnType(int *vartype); /* Читает тип низкоуровнено заданной переменной.*/ int Debug_LowLevel_ReadVarType(int *vartype); #endif //DEBUG_TOOLS