#ifndef __HD_NEW_LOG_H__ #define __HD_NEW_LOG_H__ #include // 使用宏开关管理日志 #ifndef LOG_CLOSE_OUT #define USE_HD_LOG_DEBUG (1) #define USE_HD_LOG_ERROR (1) #define USE_HD_LOG_DATA (1) #define USE_HD_TRACE (1) #define USE_HD_FPGA_CHECK (1) #endif // 当前检查栈数量的线程总数 #define USE_CHECK_STACK_NUM (1) // 使用系统的栈检查 #define USE_SYS_CHECK_STACK (0) // 使用系统的堆检查 #define USE_SYS_CHECK_HEAP (0) // 使用RTOS的日志锁 #define USE_RTOS_LOG_LOCK (0) // 标准日志输出 #define _LogDExtLevel(level, format, ...) HDLogOut(1, level, __FILE__, __func__, __LINE__, format, ##__VA_ARGS__) #define _LogDLevel(level, format, ...) HDLogOut(0, level, __FILE__, __func__, __LINE__, format, ##__VA_ARGS__) #if USE_HD_TRACE #define LogTr(format, ...) _LogDLevel(kLogLevelTrace, format, ##__VA_ARGS__) #define LogTrace() LogTr("") #else #define LogTr(format, ...) #define LogTrace() #endif #if USE_HD_LOG_DEBUG #define LogD(format, ...) _LogDLevel(kLogLevelDebug, format, ##__VA_ARGS__) #define LogDExt(format, ...) _LogDExtLevel(kLogLevelDebug, format, ##__VA_ARGS__) #define LogLine() LogDExt("\r\n") #else #define LogD(...) #define LogDExt(...) #define LogLine() #endif #if USE_HD_LOG_ERROR #define LogE(format, ...) _LogDLevel(kLogLevelError, format, ##__VA_ARGS__) #else #define LogE(...) #endif #if USE_HD_LOG_DATA #define LogData(data, len) HDLogData((const uint8_t *)data, len, 1) #define LogFpgaData(data, len, isWrite) HDLogPrintFpga((const uint8_t *)data, len, isWrite, 1) #define LogHexData(data, len) HDLogHex((const uint8_t *)data, len, 1, NULL) #else #define LogData(data, len) #define LogFpgaData(data, len, isWrite) #define LogHexData(data, len) #endif enum eLogLevel { kLogLevelSwitch = 0, ///< 日志开关 kLogLevelColor, ///< 彩色日志 kLogLevelDebug, ///< 常规调试信息 kLogLevelError, ///< 错误信息 kLogLevelHex, ///< 十六进制日志 kLogLevelStack, ///< 打印栈大小信息 kLogLevelHeap, ///< 打印堆大小信息 kLogLevelTrace, ///< trace级别日志 kLogLevelMax, }; /** * @brief 日志初始化 */ void HDLogInit(uint32_t (*getTime)()); /** * @brief 格式打印 **/ void HDLogOut(uint8_t ext, uint8_t level, const char *fileName, const char *funcName, int line, const char *format, ...); /** * @brief 打印FPGA * @param data FPGA数据 * @param len 数据长度 * @param isWrite 是否是写 * @param checkFpga 是否更新检查FPGA数据 * @return 是fpga数据或者需要打印返回1 否则返回0 */ uint8_t HDLogPrintFpga(const uint8_t *data, int len, uint8_t isWrite, uint8_t checkFpga); uint8_t HDLogCheckFpgaHeader(const uint8_t *data, int len); /** * @brief 十六进制格式打印数据 * @param data 数据 * @param len 数据长度 * @param checkPrint 是否检查打印开关是否打开 * @param offset 打印偏移, 一般传递 NULL 即可 **/ void HDLogHex(const uint8_t *data, int len, uint8_t checkPrint, uint32_t *offset); /** * @brief 无格式以16进制打印数据, 打印16个换行 * @param data 数据 * @param len 数据长度 * @param checkPrint 是否检查打印开关是否打开 */ void HDLogData(const uint8_t *data, int len, uint8_t checkPrint); typedef unsigned long(*HDLogGetTaskType_t)(); /** * @brief 设置获取当前任务的方法 * @param getTask 获取当前任务, 如果非RTOS, 传递 NULL */ void HDLogDebugSetGetTask(HDLogGetTaskType_t getTask); /** * @brief 设置当前任务的栈大小 * @param currTask 当前任务, 如果非RTOS, 传递 NULL * @param size 栈大小 */ void HDLogDebugInitStackAddr(unsigned long currTask, uint32_t size); /** * @brief 删除当前任务的栈大小记录 * @param currTask 当前任务 */ void HDLogDebugDeleteStackAddr(unsigned long currTask); /** * @brief 获取当前任务的栈大小 * @return 当前栈使用大小 */ uint32_t HDLogDebugGetCurrStackSize(); typedef uint32_t(*HDLogGetStackSizeType_t)(unsigned long currTask); /** * @brief 设置获取当前任务的栈大小方法 * @param getStackSize 获取当前任务的栈大小 */ void HDLogSetGetCurrStackSizeCall(HDLogGetStackSizeType_t getStackSize); /** * @brief 设置获取当前任务的堆剩余大小方法, 当前仅支持RTOS * @param getHeadSize 获取当前任务的堆剩余大小 */ void HDLogSetGetCurrHeapSizeCall(HDLogGetStackSizeType_t getHeapSize); #endif // __HD_NEW_LOG_H__