MTK 调试的奇巧淫技

我在很久很久以前曾经写过一篇介绍TRACE的文章,那里介绍了不少TRACE技能和解决BUG的技巧。这次只把其中的TRACE的应用说进一步介绍。这里假设你对MTK自带的TRACE函数kal_prompt_trace有了比较深刻的认识,对其应用范围和使用的局限性也有了一定了解的情况下可来阅读本文。

理论上来说,kal_prompt_trace可以应用在可以应用TRACE的任何场合,但也有其很明显的局限性。比如以下三种情况:

1.USB方面的BUG,占用了插口,无法使用,不包括使用硬件加串口的情况。

2.充电方面的BUG,原因同上

3.MMI层未初始化的情况下

4.有些驱动代码中,该函数无法正常运行

5.没有数据库校准文件或者校准文件不正确的情况下

如何对上面的TRACE做一些改造,以适应上面的情况,不仅仅是一个很有趣的问题,同时也是一个很有现实意义的问题。比如对于1和2,我们很多同志采用找硬件工程再接一个端口的情况,这当然也是可以的,但能用软件解决,就有软件解决,有利于节约公司的资源。对于后两种情况,我们常常使用直接写端口的函数PutUARTBytes来解决。能不能统一一下,写一个公共函数来实现满足以上所有条件的调试函数呢?

#if 1 //jia #define TIMEFILE L"E://mytrace.txt" #define MY_TRACE_TYPE (0) //选择TRACE方式,可选0,1,2,3,4,,5 void WriteTimeFile( WCHAR * fn, U8 * data, U32 len) { FS_HANDLE pf; U32 wlen; S8 ret; MMI_ASSERT((fn != NULL) && (data != NULL)); pf = FS_Open(fn, FS_READ_WRITE|FS_CREATE); if (pf >= 0) { FS_Seek(pf, 0, FS_FILE_END); FS_Write(pf, data, len, &wlen); FS_Commit(pf); FS_Close(pf); } } void drawChineseString(U8 *s, U16 len, S32 x, S32 y, color c) { S8 des[256] = {0}; S8 * src; MMI_ASSERT((src != NULL) && (len != 0)); src = (S8 *)s; mmi_chset_text_to_ucs2(des, len + 2, src); gui_move_text_cursor(x, y); gui_set_text_color(c); gui_print_text(des); return; } void my_trace(char *fmt, ...) { #ifdef MMI_ON_HARDWARE_P va_list list; char buf[255]; char *ptr = (char*)buf; memset(buf, 0, sizeof(buf)); strcpy(ptr, "[jia]: "); ptr += strlen("[jia]: "); va_start(list, fmt); vsprintf(ptr, fmt, list); va_end(list); strcat(buf, "/r/n"); buf[255] = 0; #if (MY_TRACE_TYPE == 1) PutUARTBytes(0, (kal_uint8 *)buf, strlen(buf));//直接写端口 #elif (MY_TRACE_TYPE == 2) WriteTimeFile(TIMEFILE, buf, strlen(buf));//USB充电状态使用 #elif (MY_TRACE_TYPE == 3) //这里我隐藏了一个直接把手机窗口做为输出窗口调试的函数 #elif (MY_TRACE_TYPE == 4) kal_prompt_trace(MOD_WAP, buf);//catcher #elif (MY_TRACE_TYPE == 5) printf(buf);//模拟器 #endif #endif } #endif

函数一切如上,使用手机窗口调试时同时可以输出中文,作为思考,有兴趣的朋友可以自己实现一下试试。

 

声明:本文是作者原创,受著作权法保护,请勿转载和用于商业用途,作者保留对侵权行为追究的权力!

你可能感兴趣的:(数据库,list,File,null,手机,MTK)