/** @file DHL_DBG.h @brief DHL Debug support APIs Copyright 2006~2010 Digital STREAM Technology, Inc. All Rights Reserved */ #ifndef __DHL_DEBUG_API_H__ #define __DHL_DEBUG_API_H__ #include "DHL_OSAL.h" //#include /* for va_list */ #include "bstd_defs.h" /* for va_list */ #include "ministd.h" #ifdef __cplusplus extern "C" { #endif #if COMMENT ____Overview____(){} #endif /** @file DHL_DBG.h À̰÷¿¡ ÀÌ ¸ðµâ¿¡ ´ëÇØ ¼³¸íÀÌ ÇÊ¿äÇÑ °¢Á¾ ³»¿ë ±â¼ú.. module overview - - APIs implementations dependencies nv parameters */ #if COMMENT ____Config____(){} #endif /* ÀÌ ºÎºÐÀº º°µµÀÇ DHL_XXX_Config configuration file À» Ȱ¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» °Í °°À½. */ #if COMMENT ____Types____(){} #endif #if COMMENT ____Defines____(){} #endif /** @brief ÁÖ¾îÁø Á¶°ÇÀÌ true°¡ ¾Æ´Ï¸é fault ¹ß»ý. ÁÖ¾îÁø Á¶°ÇÀÌ ÂüÀÌ ¾Æ´Ï¸é assert¸¦ ¹ß»ý½ÃŲ´Ù. ÇöÀç assert´Â ÀÎÅÍ·´Æ®¸¦ disable ÇÏ°í ¹«ÇÑ´ë±â»óÅ·ΠºüÁö´Â °ÍÀÌ´Ù. @param[in] cond true/false¸¦ ÆÇ´ÜÇÒ Á¶°Ç. @param[in] msg formatted ÅØ½ºÆ®´Â ÀԷ¹ÞÁö ¸øÇÔ. */ #define DHL_ASSERT(cond, msg) DHL_DBG_GenerateAssert(cond, msg, __FILE__, __LINE__) /** @brief ÀÌ ÇÔ¼ö´Â ³»ºÎ¿ëÀÌ´Ù. DHL_ASSERT¸¦ »ç¿ëÇϱ⠹ٶ÷. */ void DHL_DBG_GenerateAssert(BOOL cond, const char *msg, const char *file, unsigned line); #define DHL_UNUSED(p) (void)p #if COMMENT ____Module_Print____(){} #endif /* cafrii 090721 change if same module_name is specified in different source file, keep previous module level settings. to do this, we first check that 'module' is really new one. */ #if 0 // ¾ÆÁ÷ ModulePrint°¡ ±¸ÇöÀÌ ¾ÈµÇ¾úÀ» °æ¿ì OS printf¸¦ ÀÌ¿ëÇÑ Àӽà ±¸Çö.. #define DHL_MODULE(str,lvl) \ static int dprint(int level, char *fmt, ...) /* selective print by module level */\ {\ char tmpbuf[200];\ va_list v;\ va_start(v, fmt);\ vsnprintf(tmpbuf, sizeof(tmpbuf)-1, fmt, v);\ DHL_OS_Printf(fmt, v);\ va_end(v);\ return 1;\ }\ static int dprint(int level, char *fmt, ...) #else #define DHL_MODULE(str,lvl) \ static char *p_module_name=str; \ static BOOL p_is_dbg_inited; \ static int dprint(int level, char *fmt, ...) /* selective print by module level */\ {\ va_list v;\ int n;\ if(!p_is_dbg_inited) {\ DHL_DBG_CheckAndInitModuleLevel(p_module_name, lvl); \ p_is_dbg_inited=TRUE;\ }\ va_start(v, fmt);\ n = DHL_DBG_LevelPrint(p_module_name, level, fmt, v);\ va_end(v);\ return n;\ }\ /* »ç½Ç ÀÌ dprint2 ÇÔ¼ö´Â ¹Ýµå½Ã ÇÊ¿äÇÏÁö´Â ¾Ê´Ù. ±×³É DHL API·Î Á¦°øÇصµ µÇ´Â ÇÔ¼öÀÓ. */ \ static int dprint2(char *key, char *fmt, ...) /* selective print by keyword */\ {\ va_list v;\ int n;\ va_start(v, fmt);\ n = DHL_DBG_KeyPrint(key, fmt, v);\ va_end(v);\ return n;\ }\ static inline BOOL dprintable(int level) \ { return DHL_DBG_CheckPrintable(DHL_DBG_GetModuleLevel(p_module_name), level); } \ static BOOL dprintable(int level) /* cafrii 090720 comment ¸¶Áö¸· ¶óÀÎ ¼±¾ð ºÎºÐÀº extra ';' ·Î ÀÎÇÑ warningÀ» ¾ø¾Ö±â À§ÇÑ trickÀÓ. °¢ ¼Ò½º ÆÄÀÏ¿¡¼­´Â DHL_DBG("module", 0); ¿Í °°Àº ½ÄÀ¸·Î ¸¶Áö¸·¿¡ ';'¸¦ ºÙ¿©Áà¾ß source insight ¿¡¼­ symbol ÀνĿ¡ ¹®Á¦°¡ ¾ø´Ù. */ #endif #if COMMENT dprintable(){} // this is linker for source insight to find here.. dprint(){} dprint2(){} #endif /** @brief ¸ðµâ ¹× print ·¹º§ - ¿ëµµ: ÀÌ °ªÀº µÎ ±ºµ¥¼­ »ç¿ë °¡´ÉÇÏ´Ù. - DHL_MODULE(.., m) ¿¡¼­ ¸ðµâ ·¹º§À» ÁöÁ¤ÇÒ ¶§ - Silent ÀÌ»óÀÇ °ªÀ» ÁöÁ¤ °¡´ÉÇÏ´Ù. - °¢ print ·¹º§ÀÌ ¸ðµâ ·¹º§º¸´Ù À۰ųª °°À¸¸é Ãâ·ÂµÈ´Ù. - dprint(n, ..) ¿¡¼­ print ·¹º§À» ÁöÁ¤ÇÒ °æ¿ì. - Error ÀÌ»óÀÇ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. - ÀÌ ·¹º§ÀÌ ¸ðµâ ·¹º§ ÀÌ»óÀ̶ó¸é Ãâ·Â µÈ´Ù. - print ·¹º§Àº ¾Æ·¡ÀÇ usage¸¦ µû¸£¸ç, (Error, Warn, Info, ..) ÀϹÝÀûÀ¸·Î ¸ðµâ ·¹º§À» Error¸¦ ÁöÁ¤ÇÑ´Ù. (¿¡·¯ ¸Þ½ÃÁö¸¸ Ãâ·ÂµÇµµ·Ï ÇÔ) - Ưº°È÷ ƯÁ¤ ¸ðµâÀ» µð¹ö±ë ÇϰíÀÚ ÇÑ´Ù¸é.. - ¸ðµâ ·¹º§À» Warn ÀÌ»óÀ¸·Î ¿Ã¸°´Ù. - ÀǵµÀûÀ¸·Î ÇØ´ç ¸ðµâÀÇ ¸ðµç ¸Þ½ÃÁö¸¦ ¸·°í ½Í´Ù¸é.. - ±× ¸ðµâÀÇ ·¹º§À» Silent·Î ¼³Á¤ÇÑ´Ù. */ typedef enum { eDBG_MODULE_LVL_Unknown = -100, eDBG_MODULE_LVL_Silent = -1, ///< ÀÌ °ªÀº print ·¹º§·Î´Â »ç¿ë ±ÝÁö! ¸ðµâ ·¹º§·Î¸¸ Àû¿ë °¡´É. eDBG_MODULE_LVL_Error = 0, ///< ¿¡·¯ ¸Þ½ÃÁö¸¸ Ç¥½ÃÇ϶ó´Â ÀǹÌ. eDBG_MODULE_LVL_Warn = 1, ///< ¿¡·¯¿Í °æ°í ¸Þ½ÃÁö¸¸ Ç¥½ÃÇ϶ó´Â ÀǹÌ. eDBG_MODULE_LVL_Info = 2, ///< ¿¡·¯, °æ°í, ÀÎÆ÷ ¸Þ½ÃÁö¸¦ Ç¥½ÃÇ϶ó´Â ÀǹÌ. eDBG_MODULE_LVL_Verbose = 3, ///< ¾Æ¹« ¸¹Àº ¸Þ½ÃÁö¸¦ Ç¥½ÃÇ϶ó.. /* you can use bigger values.. */ } tDBG_MODULE_LVL; /* source code ³»¿¡¼­ run-time ½Ã¿¡ debug level °ü¸®¸¦ ÇϰíÀÚ ÇÏ´Â °æ¿ì »ç¿ë. Shell »ó¿¡¼­ Á¶ÀÛÇÏ´Â °æ¿ì´Â pml, sml, pdt, sdt µîÀÇ alias ÀÌ¿ëÇÏ¸é ÆíÇÏ´Ù. */ /** @brief ¸ðµâÀÇ µð¹ö±× ·¹º§À» º¯°æÇÑ´Ù. À̸§Àº Á¤È®ÇÏ°Ô ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. ¸¸¾à ¸ðµâ ¸®½ºÆ®¿¡ ÁöÁ¤ÇÑ À̸§ÀÇ ¸ðµâÀÌ ¾ø´Ù¸é »õ·Ó°Ô Ãß°¡µÈ´Ù. @param[in] name º¯°æÇϰíÀÚ ÇÏ´Â ¸ðµâ À̸§ @param[in] level º¯°æÇÒ ·¹º§. Silent ÀÌ»óÀÇ °ª ÁöÁ¤ °¡´É. */ void DHL_DBG_SetModuleLevel(char *name, int level); /** @brief ¸ðµâÀÇ ·¹º§À» ¸®ÅÏÇÑ´Ù. @param[in] name ¾Ë°íÀÚ ÇÏ´Â ¸ðµâ À̸§ return ¸ðµâ ·¹º§ */ int DHL_DBG_GetModuleLevel(char *name); /** */ int DHL_DBG_CheckAndInitModuleLevel(char *module_name, int level); /* level check ÇÏ´Â ·çƾÀ» ÇÑ ±ºµ¥·Î ÅëÇÕÇÑ´Ù. DHL_DBG_LevelPrint, dprintable, ±âŸ ÇÊ¿äÇÑ °÷¿¡¼­ ÀÌ macro¸¦ »ç¿ëÇϵµ·Ï ÇÑ´Ù. TRUE À̸é ÇØ´ç print ¹®Àº Ãâ·ÂÀÌ °¡´ÉÇÏ´Ù´Â ÀǹÌÀÓ. FALSEÀÌ´Â Ãâ·ÂÀÌ ºÒ°¡´ÉÇÑ ·¹º§. */ #define DHL_DBG_CheckPrintable(module_level, print_level) \ ((module_level) >= (print_level) ? TRUE : FALSE) /** @brief ÇØ´ç LevelÀ» ÆÇ´ÜÇÏ¿© PrintÀÇ ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù. @param[in] prefix ¸ðµâ ±¸ºÐ ¹®ÀÚ¿­. ÃÖ´ë 6ÀÚ ±îÁö¸¸ Áö¿øÇÑ´Ù. @param[in] level print ·¹º§. enum ´ë½Å ±×³É ¼ýÀÚ·Î ÁöÁ¤À» ÇÑ´Ù. @param[in] format @param[in] ap */ int DHL_DBG_LevelPrint(char *prefix, int level, char *format, va_list ap); /* */ int DHL_DBG_KeyPrint(char *prefix, char *format, va_list ap); /* */ int DHL_DBG_SetDbgKey(char *text_name, BOOL is_on); /** */ void DHL_DBG_PrintModuleLevel(const char *substr); #if COMMENT ____Alias_Symbol____(){} #endif /** @name DHL Symbol Table (Alias Symbol) @{ DHL ¿¡¼­ Á¦°øÇÏ´Â symbol table. °³¹ß Åø, ¶Ç´Â OS¿¡¼­ ÀÚüÀûÀ¸·Î Á¦°øÇÏ´Â symtabÀÌ ¾ø´Â °æ¿ì »ç¿ëÇÏ¸é µÈ´Ù. ´Ù¸¥ symtabÀÌ ÀÖ´Â °æ¿ì¿¡µµ short cut ±â´É µîÀ» »ç¿ëÇÒ °æ¿ì ÇÊ¿äÇÏ´Ù. */ #define DHL_SYM_NONE 0 #define DHL_SYM_V1 1 // == sizeof(UINT8) #define DHL_SYM_V2 2 // == sizeof(UINT16) #define DHL_SYM_V4 4 // == sizeof(UINT32) #define DHL_SYM_Vx 8 // no information about data size. #define DHL_SYM_FN 0x10 #define DHL_SYM_ALL 0xf // purpose?? /** @brief DHL¿¡¼­ °ü¸®ÇÏ´Â alias symbol node. Á¤È®È÷ Ç¥ÇöÇÏÀÚ¸é SymbolEntry ¶ó°í ÇØ¾ß ¸Â´Ù. ±×·¯³ª ÀÌ Å¸ÀÔÀ» »ç¿ëÇÏ´Â °÷ÀÌ ³Ê¹« ¸¹À¸¹Ç·Î ÀÌ À̸§À» ±×´ë·Î »ç¿ëÇϵµ·Ï ÇÑ´Ù. */ typedef struct { char *name; void *ptr; UINT8 type; // DHL_SYM_XX } DHL_SymbolTable; #define DHL_NUMSYMBOLS(tbl) (sizeof((tbl))/sizeof((tbl)[0])) // // symbol table Á¤ÀǸ¦ ½±°Ô ÇÒ ¼ö ÀÖ´Â macro // #define DHL_FNC_SYM_ENTRY(fn) { #fn, (void *)fn, DHL_SYM_FN, } #define DHL_VAR_SYM_ENTRY(va) { #va, &va, sizeof(va), } #define DHL_FNC_SYM_ENTRY2(name, fn) { name, (void *)fn, DHL_SYM_FN, } #define DHL_FNC_SYM_ARGS(fn) #fn, fn #define DHL_VAR_SYM_ARGS(va) #va, &va, sizeof(va) /** @brief Symbol Å×À̺í Ãâ·Â. ÁöÁ¤ÇÑ ¹®ÀÚ¿­À» substringÀ¸·Î °®´Â symbol tableÀ» ¸ðµÎ Ãâ·ÂÇÑ´Ù. Ãâ·ÂÀº OS DbgPrintf ¸¦ »ç¿ëÇÑ´Ù. ShellÀÇ ³»ºÎ "show" ¸í·É¿¡¼­ »ç¿ëÇÑ´Ù. */ void DHL_DBG_PrintSymbolTable(int showmask, char *substr); /** @brief ÇÔ¼ö symbol µî·Ï API ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¸é ´õ ½±°Ô µî·ÏÇÒ ¼ö ÀÖ´Ù. */ void DHL_DBG_RegisterFunctionSymbol(char *name, void *ptr); /** @brief º¯¼ö symbol µî·Ï API ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¸é ´õ ½±°Ô µî·ÏÇÒ ¼ö ÀÖ´Ù. */ void DHL_DBG_RegisterVarSymbol(char *name, void *ptr, int size); /** @brief ÇÔ¼ö/º¯¼ö symbol list µî·Ï API ¹Ì¸® Á¤ÀÇµÈ symbol list¸¦ ÇѲ¨¹ø¿¡ µî·ÏÇÑ´Ù. */ void DHL_DBG_RegisterSymbols(DHL_SymbolTable *tbls, int n); /** @brief DHL Symbol °Ë»ö API À̸§À¸·Î symbol Á¤º¸¸¦ ã´Â ÇÔ¼ö. symbol pointer¿Í typeÀÌ ¸®ÅϵȴÙ. ¹ß°ßµÇÁö ¾ÊÀ¸¸é ¿¡·¯ ¸®ÅÏ. Shell ¿¡¼­ ÀÔ·ÂÇÑ command¸¦ parsingÇÏ¿© ½ÇÇàÇÒ ¶§ »ç¿ëµÈ´Ù. */ DHL_RESULT DHL_DBG_QuerySymbol(char *name, void **pptr, int *ptype); /*@}*/ #if COMMENT ____Shell____(){} #endif typedef struct { BOOL started; ///< true if dbg shell running. DHL_OS_TASK_ID tid; ///< task id of running shell. } DHL_DBG_SHELL_INFO; /** @brief Debug shell À» ±âµ¿ÇÑ´Ù. shell ¿¡¼­ Áö¿ø °¡´ÉÇÑ ¸í·É¾î´Â ÇØ´ç module ¼Ò½º Âü°í. »ç½Ç ÀÌ ÇÔ¼ö´Â ¿ÜºÎ¿¡¼­ »ç¿ëÇÒ °æ¿ì´Â ¾ø°í, DHL ³»ºÎ ±¸Çö½Ã »ç¿ëÇÑ´Ù. µû¶ó¼­ API¿¡ Æ÷Ç﵃ ÇÊ¿ä´Â ¾øÀ¸³ª, ÀÏ´Ü ¿©±â¿¡ µÎµµ·Ï ÇÏÀÚ. @todo DHL DBG Private Çì´õ ÆÄÀÏ ÇÊ¿ä. */ void DHL_DBG_StartDbgShell(void); /** @brief Debug shellÀÇ Á¤º¸¸¦ °¡Á®¿Â´Ù. @param[out] pInfo ½© Á¤º¸°¡ ÀúÀåµÉ °÷. */ void DHL_DBG_GetDbgShellInfo(DHL_DBG_SHELL_INFO *pInfo); /** @brief ÇöÀç task°¡ shell taskÀÎÁö üũ. @return ÇöÀç task°¡ shell À̶ó¸é TRUE¸¦ ¸®ÅÏÇÑ´Ù. */ BOOL DHL_DBG_IsDbgShell(void); /** @brief shell¿¡¼­ ¸í·É ÀÔ·ÂÀÌ µÇ´Â °Íó·³ emulation ÇÑ´Ù. @param[in] cmd ¿¡¹Ä·¹ÀÌ¼Ç ¼öÇà ÇÒ ¸í·É. */ void DHL_DBG_EmulateCommand(const char *cmd); #if COMMENT ____MemDump____(){} #endif #define MEMDUMP_ALIGN 0x1 #define MEMDUMP_NOHDR 0x2 /** @brief Á¤ÇØÁø ¸Þ¸ð¸® ¿µ¿ªÀÇ ³»¿ëÀ» È­¸é¿¡ Ãâ·ÂÇÑ´Ù. @param[in] buf ´ýÇÁÇÒ ¸Þ¸ð¸® ¿µ¿ª. @param[in] size ¸Þ¸ð¸® ´ýÇÁ »çÀÌÁî. @param[in] msg @param[in] off off´Â displayed address¸¦ ¸ÂÃß±â À§ÇØ »ç¿ëµÇ´Â offset @param[in] flag */ void DHL_DBG_MemDump3(void *buf, int size, char *msg, UINT32 off, UINT32 flag); /** @brief DHL_MemDump3(buf0, size, msg, off, MEMDUMP_ALIGN); */ void DHL_DBG_MemDump2(void *buf, int size, char *msg, UINT32 off); /** @brief DHL_MemDump3(buf, size, msg, 0, MEMDUMP_ALIGN); */ void DHL_DBG_MemDump (void *buf, int size, char *msg); #define memdump DHL_DBG_MemDump #define memdump2 DHL_DBG_MemDump2 #define memdump3 DHL_DBG_MemDump3 /** @brief µÎ °³ÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» ºñ±³ÇÑ´Ù. C standard library¿¡ ÀÖ´Â memcmp¿Í ºñ½ÁÇÑ ±â´ÉÀ» ÇÏÁö¸¸ ¸®ÅϰªÀÌ ´Ù¸£´Ù. °°À¸¸é -1À» ¸®ÅÏÇϰí, ´Ù¸£¸é mismatch°¡ ½ÃÀÛµÈ ±× offsetÀ» ¸®ÅÏÇÑ´Ù. @param[in] s1 ù ¹øÂ° ºñ±³ ´ë»ó ¸Þ¸ð¸® ¿µ¿ª @param[in] s2 µÎ ¹øÂ° ºñ±³ ´ë»ó ¸Þ¸ð¸® ¿µ¿ª @param[in] len ºñ±³ °Ë»çÇÒ ¿µ¿ªÀÇ ±æÀÌ */ int DHL_DBG_MemCmp(const unsigned char *s1, const unsigned char *s2, int len); #if COMMENT ____Init____(){} #endif /** */ void DHL_DBG_Init(void); //void DHL_DBG_Uninit(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __DHL_DEBUG_API_H__ */