类似printf功能的函数

  • 直接贴代码以及解释如下:
/* 头文件 */
#include <stdio.h>	/* vsnprintf与vsprintf */
#include <stdarg.h>	/* va... */

#define size 256
char buffer[size];	/* 比较建议定义为全局变量,因为RTOS中的任务调用此函数时,会多占用任务的栈空间 */
int uprintf(const char *f, ...)
{
    
    
	int i = 0;
	va_list arg_ptr;	/* 定义va_list型变量,这个变量是指向参数的指针 */

	/* 将字符放入缓冲区 */
	va_start(arg_ptr, f);	/* 初始化变量arg_ptr */
    /* vsnprintf无溢出风险,vsprintf有溢出风险,功能一样 */
	vsnprintf(buffer, size, f, arg_ptr);	/* 装载数据 */
//	vsprintf(buffer, f, arg_ptr);
    va_end(arg_ptr); 	/* 清空可变参数列表 */

    /* 输出缓冲区数据 */
	while(buffer[i]) 
	{
    
    
		transmit_char(buffer[i]);	/* 单字节串口输出 */
		i++;
	}
	return i;
}

/* 实际应用(与printf功能一样) */
int var = 10;
uprintf("%d", var);
  • 生成代码大小问题

实际应用中发现,编译未进行优化,实际生成的代码大小增大8~9k。建议调试时候使用。

可定义个宏来控制开关,参考代码如下:


#define DEBUG_UPRINT  1		/* 控制开关,1开,0关 */

int uprintf(const char *f, ...)
{
    
    
    #if DEBUG_UPRINT
    
    /* 与上述代码一致 */
    
    #else
    	return 0;
    #endif
}


  • 其他

    编写或是解释难免有错,欢迎指正。
    如有侵权,联系我删除,谢谢!!!

猜你喜欢

转载自blog.csdn.net/ping_devil/article/details/108415578