269 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #ifndef _VOS_DEBUG_H_
 | |
| #define _VOS_DEBUG_H_
 | |
| 
 | |
| #include <stdarg.h>
 | |
| #include <kwrap/type.h>
 | |
| 
 | |
| 
 | |
| #if defined(__LINUX) && defined(__KERNEL__)
 | |
| #include <linux/printk.h>
 | |
| #define vk_pr_warn pr_warn
 | |
| #define vk_printk printk
 | |
| #define vk_print_isr printk
 | |
| #define vos_dump_stack dump_stack
 | |
| #define __DBG_COLOR_MONO__
 | |
| 
 | |
| #elif defined(__FREERTOS)
 | |
| #define vk_pr_warn debug_msg_isr
 | |
| #define vk_printk debug_msg_isr
 | |
| #define vk_print_isr debug_msg_isr
 | |
| 
 | |
| #ifndef unlikely
 | |
| #define unlikely(x) (x)
 | |
| #endif
 | |
| 
 | |
| #ifndef KERN_EMERG
 | |
| #define KERN_EMERG ""
 | |
| #endif
 | |
| 
 | |
| #else
 | |
| #include <stdio.h>
 | |
| #define vk_pr_warn printf
 | |
| #define vk_printk printf
 | |
| #define vk_print_isr printf
 | |
| 
 | |
| #ifndef unlikely
 | |
| #define unlikely(x) (x)
 | |
| #endif
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #define NVT_DBG_FATAL     0
 | |
| #define NVT_DBG_ERR       1
 | |
| #define NVT_DBG_WRN       2
 | |
| #define NVT_DBG_UNIT      3
 | |
| #define NVT_DBG_FUNC      4
 | |
| #define NVT_DBG_IND       5
 | |
| #define NVT_DBG_MSG       6
 | |
| #define NVT_DBG_VALUE     7
 | |
| #define NVT_DBG_USER      8
 | |
| 
 | |
| #define _TOKEN_BIND(a, b)  a ## b
 | |
| #define TOKEN_BIND(a, b)  _TOKEN_BIND(a, b)
 | |
| 
 | |
| //If __MODULE__ not defined, just give it a name to let other macros can be used
 | |
| #ifndef __MODULE__
 | |
| #define __MODULE__ __SHORT_FILE__
 | |
| #endif
 | |
| 
 | |
| //If __DBGLVL__ not defined, use NVT_DBG_WRN as the default level
 | |
| #ifndef __DBGLVL__
 | |
| #define __DBGLVL__ NVT_DBG_WRN
 | |
| #endif
 | |
| 
 | |
| /**
 | |
| 	If __DBGLVL__ equals NVT_DBG_USER, the debug level is controlled by users
 | |
| 	Otherwise, the debug level is fixed to __DBGLVL__
 | |
| 
 | |
| 	e.g.
 | |
| 	1. Fixed debug level
 | |
| 	@code
 | |
|     {
 | |
| 		#define __MODULE__ my_module
 | |
| 		#define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
 | |
| 		#include <kwrap/debug.h>
 | |
| 	}
 | |
|     2. Dynamic debug level (an extern variable is requred)
 | |
| 	@code
 | |
|     {
 | |
| 		#define __MODULE__ my_module
 | |
| 		#define __DBGLVL__ 8 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
 | |
| 		#include <kwrap/debug.h>
 | |
| 
 | |
| 		unsigned int my_module_debug_level = NVT_DBG_WRN;
 | |
| 		//Note: It will cause linking error if you set __DBGLVL__ as 8 but the variable is not found
 | |
| 	}
 | |
| */
 | |
| #if (__DBGLVL__ == NVT_DBG_USER)
 | |
| #define _NVT_DBG_CURRENT_ TOKEN_BIND(__MODULE__, _debug_level)
 | |
| extern unsigned int _NVT_DBG_CURRENT_;
 | |
| 
 | |
| #define nvt_dbg(level, fmt, args...) do { \
 | |
| 	if (unlikely(NVT_DBG_##level <= _NVT_DBG_CURRENT_)) { \
 | |
| 		vk_pr_warn(fmt, ##args); \
 | |
| 	} \
 | |
| } while (0)
 | |
| 
 | |
| #else //#if (__DBGLVL__ == NVT_DBG_USER)
 | |
| #define _NVT_DBG_CURRENT_ __DBGLVL__
 | |
| #define nvt_dbg(level, fmt, args...) NVT_PRINT_##level(fmt, ##args)
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_FATAL)
 | |
| #define NVT_PRINT_FATAL(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_FATAL(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_ERR)
 | |
| #define NVT_PRINT_ERR(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_ERR(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_WRN)
 | |
| #define NVT_PRINT_WRN(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_WRN(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_UNIT)
 | |
| #define NVT_PRINT_UNIT(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_UNIT(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_FUNC)
 | |
| #define NVT_PRINT_FUNC(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_FUNC(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_IND)
 | |
| #define NVT_PRINT_IND(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_IND(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_MSG)
 | |
| #define NVT_PRINT_MSG(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_MSG(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_VALUE)
 | |
| #define NVT_PRINT_VALUE(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_VALUE(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #if (_NVT_DBG_CURRENT_ >= NVT_DBG_USER)
 | |
| #define NVT_PRINT_USER(fmt, args...) vk_pr_warn(fmt, ##args)
 | |
| #else
 | |
| #define NVT_PRINT_USER(fmt, args...)
 | |
| #endif
 | |
| 
 | |
| #endif //#if (__DBGLVL__ == NVT_DBG_USER)
 | |
| 
 | |
| #ifdef __DBG_COLOR_MONO__
 | |
| #define DBG_COLOR_GRAY ""
 | |
| #define DBG_COLOR_RED ""
 | |
| #define DBG_COLOR_YELLOW ""
 | |
| #define DBG_COLOR_CYAN ""
 | |
| #define DBG_COLOR_GREEN ""
 | |
| #define DBG_COLOR_MAGENTA ""
 | |
| #define DBG_COLOR_BLUE ""
 | |
| #define DBG_COLOR_WHITE ""
 | |
| #define DBG_COLOR_HI_GRAY ""
 | |
| #define DBG_COLOR_HI_RED ""
 | |
| #define DBG_COLOR_HI_YELLOW ""
 | |
| #define DBG_COLOR_HI_CYAN ""
 | |
| #define DBG_COLOR_HI_GREEN ""
 | |
| #define DBG_COLOR_HI_MAGENTA ""
 | |
| #define DBG_COLOR_HI_BLUE ""
 | |
| #define DBG_COLOR_HI_WHITE ""
 | |
| #define DBG_COLOR_FATAL ""
 | |
| #define DBG_COLOR_ERR ""
 | |
| #define DBG_COLOR_WRN ""
 | |
| #define DBG_COLOR_UNIT ""
 | |
| #define DBG_COLOR_FUNC ""
 | |
| #define DBG_COLOR_IND ""
 | |
| #define DBG_COLOR_MSG ""
 | |
| #define DBG_COLOR_VALUE ""
 | |
| #define DBG_COLOR_USER ""
 | |
| #define DBG_COLOR_END ""
 | |
| #else
 | |
| #define DBG_COLOR_GRAY "\033[0;30m"
 | |
| #define DBG_COLOR_RED "\033[0;31m"
 | |
| #define DBG_COLOR_YELLOW "\033[0;33m"
 | |
| #define DBG_COLOR_CYAN "\033[0;36m"
 | |
| #define DBG_COLOR_GREEN "\033[0;32m"
 | |
| #define DBG_COLOR_MAGENTA "\033[0;35m"
 | |
| #define DBG_COLOR_BLUE "\033[0;34m"
 | |
| #define DBG_COLOR_WHITE "\033[0;37m"
 | |
| #define DBG_COLOR_HI_GRAY "\033[1;30m"
 | |
| #define DBG_COLOR_HI_RED "\033[1;31m"
 | |
| #define DBG_COLOR_HI_YELLOW "\033[1;33m"
 | |
| #define DBG_COLOR_HI_CYAN "\033[1;36m"
 | |
| #define DBG_COLOR_HI_GREEN "\033[1;32m"
 | |
| #define DBG_COLOR_HI_MAGENTA "\033[1;35m"
 | |
| #define DBG_COLOR_HI_BLUE "\033[1;34m"
 | |
| #define DBG_COLOR_HI_WHITE "\033[1;37m"
 | |
| #define DBG_COLOR_FATAL "\033[1;31m"
 | |
| #define DBG_COLOR_ERR "\033[1;31m"
 | |
| #define DBG_COLOR_WRN "\033[1;33m"
 | |
| #define DBG_COLOR_UNIT "\033[0;32m"
 | |
| #define DBG_COLOR_FUNC "\033[0;36m"
 | |
| #define DBG_COLOR_IND ""
 | |
| #define DBG_COLOR_MSG ""
 | |
| #define DBG_COLOR_VALUE ""
 | |
| #define DBG_COLOR_USER ""
 | |
| #define DBG_COLOR_END "\033[0m"
 | |
| #endif
 | |
| 
 | |
| #define DBG_FATAL(fmt, args...)         nvt_dbg(FATAL, DBG_COLOR_FATAL "FATAL:%s() " fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_ERR(fmt, args...)           nvt_dbg(ERR,   DBG_COLOR_ERR   "ERR:%s() "   fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_WRN(fmt, args...)           nvt_dbg(WRN,   DBG_COLOR_WRN   "WRN:%s() "   fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_UNIT(fmt, args...)          nvt_dbg(UNIT,  DBG_COLOR_UNIT  "UNIT:%s() "  fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_FUNC_BEGIN(fmt, args...)    nvt_dbg(FUNC,  DBG_COLOR_FUNC  "%s():begin " fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_FUNC(fmt, args...)          nvt_dbg(FUNC,  DBG_COLOR_FUNC  "%s(): "      fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_FUNC_END(fmt, args...)      nvt_dbg(FUNC,  DBG_COLOR_FUNC  "%s():end "   fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_IND(fmt, args...)           nvt_dbg(IND,   DBG_COLOR_IND   "%s() "       fmt DBG_COLOR_END, __func__, ##args)
 | |
| #define DBG_MSG(fmt, args...)           nvt_dbg(MSG,   DBG_COLOR_MSG   fmt DBG_COLOR_END, ##args)
 | |
| #define DBG_VALUE(fmt, args...)         nvt_dbg(VALUE, DBG_COLOR_VALUE fmt DBG_COLOR_END, ##args)
 | |
| #define DBG_USER(fmt, args...)          nvt_dbg(USER,  DBG_COLOR_USER  fmt DBG_COLOR_END, ##args)
 | |
| #define DBG_DUMP(fmt, args...)          vk_pr_warn(fmt, ##args)
 | |
| 
 | |
| // only used in ISR. max string len is limited
 | |
| #define DBG_ISR(fmt, args...)           vk_print_isr(fmt, ##args)
 | |
| 
 | |
| #define CHKPNT    vk_pr_warn(DBG_COLOR_WHITE "CHK: %d, %s\r\n" DBG_COLOR_END, __LINE__, __func__)
 | |
| #define DBGD(x)   vk_pr_warn(DBG_COLOR_MAGENTA "%s=%d\r\n" DBG_COLOR_END, #x, x)
 | |
| #define DBGH(x)   vk_pr_warn(DBG_COLOR_MAGENTA "%s=0x%08X\r\n" DBG_COLOR_END, #x, x)
 | |
| 
 | |
| #if defined(__FREERTOS)
 | |
| extern void profile_task_busy(void);
 | |
| extern void profile_task_idle(void);
 | |
| #define PROFILE_TASK_BUSY() profile_task_busy()
 | |
| #define PROFILE_TASK_IDLE() profile_task_idle()
 | |
| #else
 | |
| #define PROFILE_TASK_BUSY()
 | |
| #define PROFILE_TASK_IDLE()
 | |
| #endif
 | |
| 
 | |
| #define ASSERT(x)                                                       \
 | |
| 	do {    if (x) break;                                               \
 | |
| 		vk_printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %s\n",      \
 | |
| 			   __FILE__, __func__, __LINE__, #x); vos_dump_stack(); vos_debug_halt();  \
 | |
| 	} while (0)
 | |
| 
 | |
| 
 | |
| #if defined(__FREERTOS)
 | |
| int debug_msg_isr(const char *fmtstr, ...);
 | |
| #endif
 | |
| 
 | |
| #ifndef exam_msg
 | |
| // exam_msg is used by auto-test. we directly define exam_msg as vk_printk to reserve for future modifications.
 | |
| #define exam_msg vk_printk
 | |
| #endif
 | |
| 
 | |
| void vos_debug_halt(void);
 | |
| 
 | |
| void debug_dumpmem(ULONG addr, ULONG length); ///< dump memory region to console output
 | |
| void debug_dumpmem2file(ULONG addr, ULONG length, CHAR *filename);
 | |
| void debug_kmsg(char *fmtstr, ...); ///< debug message entry
 | |
| void debug_kmsg_register(void (*fp)(const char *fmtstr, ...)); ///< hook debug msg
 | |
| 
 | |
| #endif //_VOS_DEBUG_H_
 | |
| 
 | |
| 
 | 
