210 lines
6.4 KiB
C
210 lines
6.4 KiB
C
#ifndef DEBUG_TOOLS
|
|
#define DEBUG_TOOLS
|
|
#include <stdint.h>
|
|
#include <limits.h>
|
|
|
|
|
|
|
|
#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
|