- 直接贴代码以及解释如下:
/* 头文件 */
#include <stdio.h> /* vsnprintf与vsprintf */
#include <stdarg.h> /* va... */
#define size 256
char buffer[size]; /* 比较建议定义为全局变量,因为RTOS中的任务调用此函数时,会多占用任务的栈空间,同时不建议在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
}
-
其他
编写或是解释难免有错,欢迎指正。
如有侵权,联系我删除,谢谢!!!