关于stm32偷懒打印、节约代码空间、输出远程日志的想法

博主近日头疼与代码空间紧张,以及没有好的重定义去输出日志,思考后分享一些想法。

适用于代码空间紧张,或者给客户终端的代码并不需要打印输出,节约应用程序的文件大小,使得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模式开关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值