+сделано задание размера короткого имени + добавлена бета поддержка stm:+ - парс переменных из файла преокта Keil или makefile CubeIDE - запись в utf-8 для STM, вместо cp1251 для TMS - другой размер int (32 бита, вместо 16 бит) для STM
181 lines
5.1 KiB
C
181 lines
5.1 KiB
C
#ifndef DEBUG_TOOLS
|
|
#define DEBUG_TOOLS
|
|
#include <stdint.h>
|
|
#include <limits.h>
|
|
|
|
|
|
//#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
|