139 lines
3.9 KiB
C
139 lines
3.9 KiB
C
|
|
|
|
#ifndef __HD_NEW_LOG_H__
|
|
#define __HD_NEW_LOG_H__
|
|
|
|
#include "sys/_intsup.h"
|
|
#include <stdint.h>
|
|
|
|
// 使用宏开关管理日志
|
|
#ifndef LOG_CLOSE_OUT
|
|
#define USE_HD_LOG_DEBUG 1
|
|
#define USE_HD_LOG_ERROR 1
|
|
#define USE_HD_LOG_DATA 1
|
|
#endif
|
|
#define USE_HD_TRACE 0
|
|
|
|
// 当前检查栈数量的线程总数
|
|
#define USE_CHECK_STACK_NUM (1)
|
|
|
|
|
|
// 标准日志输出
|
|
#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 LogTrace() LogD()
|
|
#else
|
|
#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(0, kLogLevelError, __FILE__, 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) do { if (HDLogPrintFpgaHeader((const uint8_t *)data, len, isWrite)) { HDLogHex((const uint8_t *)(data) + 17, (len) - 21, 1, NULL); } } while (0)
|
|
#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, ///< 打印栈大小信息
|
|
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 是否是写
|
|
* @return 是fpga数据或者需要打印返回1 否则返回0
|
|
*/
|
|
uint8_t HDLogPrintFpgaHeader(const uint8_t *data, int len, uint8_t isWrite);
|
|
|
|
/**
|
|
* @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);
|
|
|
|
#endif // __HD_NEW_LOG_H__
|