博主近日头疼与代码空间紧张,以及没有好的重定义去输出日志,思考后分享一些想法。
适用于代码空间紧张,或者给客户终端的代码并不需要打印输出,节约应用程序的文件大小,使得OTA文件接收更快、提高执行效率等。可以采用宏定义的方式,重定义printf函数。
很简单,在公共的头文件中,加入下面宏定义
#define __DEBUG__ 1
#if( __DEBUG__ )
#define p(format,...) printf(format,##__VA_ARGS__)
#else
#define p(format,...)
#endif
那么当想要打印的时候,用p代替printf,可以定义可读性好点名称,懒的话,用一个字母代替。
eg:
int a;
float b;
p(“ab value %d %f”,a,b);
如果a,b是局部变量,那么a,b就是随机数,全局变量是0。
当不需要打印信息时候,将__DEBUG__ 定义为 0 ,那么p的代码语句就不会编译到代码中,不用一个个去注释删除打印,节约代码空间。
还有一个技巧是输出成日志,这里的日志是产品不在身边,需要找bug的时候比较有用。也是重新定义打印函数,日志有两种方式输出,一种是将日志先存储起来,需要的时候,去存储芯片读出来,这种处理比较复杂,不好说明,根据需求去设计。一种是直接将要打印的数据,通过无线设备,发送到云端,直接上代码思路
//可变参需要添加这个头文件
#include <stdarg.h>
void p(const char *fmt, ...)
{
char buf[1024]; //根据实际定义大小,可以放到全局,避免栈溢出。
int len;//统计数据包的长度
va_list args; //定义一个可变参指针 args
va_start(args, fmt); //args指向fmt中的待转换参数(%)
len = vsprintf(buf, fmt, args); //调用vsprintf进行数据格式化,放到buf,返回长度
va_end(args); //在这包数据最后面添加一个字符0
//可以根据实际需要,添加一些时间内容(要有RTC功能),或者在这包数据的前后,添加点什么,成JSON格式最好
// len += sprintf(&buf[len],",\"timeStamp\":\"%d-%02d-%02d-%02d:%02d:%02d\"",2000 + GetData.Year,GetData.Month,GetData.Date, GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
// 根据个人底层的无线通信API,将数据发生出去,这里没有考虑丢包、发生失败的情况
// P2P_Send_Process((uint8_t *)buf,len);
puts(printf_buf); //将这个buf打印出来
}
只是简单描述了下发送到云端的思路,可以定义个变量,远程指令去控制这个debug模式开关。