/***************************** file:my_debug.h ******************************/
#ifndef _MY_DEBUG_H_ #define _MY_DEBUG_H_
#include <string.h> #include <stdarg.h> #include <stdio.h>
#define MY_DEBUG
#ifdef MY_DEBUG void my_printf(char *,...); #define WriteLog my_printf #else void nop_(char *,...); #define WriteLog nop_ #endif
#endif
/***************************** file:my_debug.c ******************************/
#include "my_debug.h" #include "uart.h"
#ifdef MY_DEBUG void my_printf(char *p,...) { va_list va; char buf[128];
va_start(va,p); vsprintf(buf,p,va); WriteUart_str(buf);
//to do something here,such as get system time and output it ....or capture some operations by users
va_end(p); } #else void nop_(char *p,...) { } #endif
/***************************** file:uart.h ******************************/
#ifndef _UART_H_ #define _UART_H_
void USART_Init(); void Write_USART(unsigned char buffer); void WriteUart_str(unsigned char *p_str);
#endif
/***************************** file:uart.c ******************************/
#include "uart.h" #include "reg52.h" #include "string.h"
void USART_Init() {
TMOD=0x20; //SMOD=0; TH1=0xfd; TL1=0xfd; SCON=0x40; REN=1; TR1=1; }
void Write_USART(unsigned char buffer) { SBUF=buffer; while(!TI); TI=0; }
char putchar (char ch) { Write_USART(ch); return 1; }
void WriteUart_str(unsigned char *p_str) { unsigned char count,i;
count = strlen(p_str);
for(i=0;i<count;i++) { Write_USART(*p_str++); } }
/***************************** file:test_debug.c ******************************/
#include "my_debug.h" #include "uart.h"
void main() { USART_Init();
WriteLog("Just have a test.....\n%d %c %f\n",(int)10,'M',3.1415926);
while(1); }
若在file:my_debug.h 使 #define MY_DEBUG 有效 那么程序处于调试状态。 WriteLog()函数打印出相关调试信息。 若使 #define MY_DEBUG 无效, 那么程序处于非调试状态。 WriteLog()函数实际上是 nop_()函数,不做任何实际操作,节约空间和时间。 但是我觉得这个做法还是不够完美,因为nop_()还是会消耗资源的。 还有什么更优的方法么?
在VC上可以这样做: 把 file:my_debug.h 中 #ifdef MY_DEBUG void my_printf(char *,...); #define WriteLog my_printf #else void nop_(char *,...); #define WriteLog nop_ #endif 改为 #ifdef MY_DEBUG void my_printf(char *,...); #define WriteLog my_printf #else void nop_(char *,...); #define WriteLog NULL #endif
这样就把调试信息完全去掉了,但是俺做KEIL上做不到这点。
|