【开源项目】tinyprintf 用于嵌入式系统的小型printf和sprintf库
简介
tinyprintf 是一个用于小型嵌入式系统的微型 printf 和 sprintf 库。这个库实际上只由两个文件 tinypprintf.c
和 tinyprintf.h
组成。
LICENSE:MIT, BSD 或者 LGPL license
项目地址:
https://github.com/cjlano/tinyprintf
http://www.sparetimelabs.com/tinyprintf/tinyprintf.php
当我们在进行小型嵌入式系统开发时,有时候会因为标准的 libc 的 printf 和 sprintf 函数占用的内存过于庞大或者是执行的效率过于低下而困扰,这个时候我们就需要一个轻量级的 printf 和 sprintf 库版本。这个时候,这个 tinyprintf 项目就非常适合我们,这个库十分的小巧,只有两个文件,可以直接放到现有项目中一起编译,适用于资源紧张的嵌入式平台。
使用
tinyprintf 库以源代码形式分发,因此要使用它们,放到你现有的项目中一起编译就可以了。代码非常少,只有 400+行。
tinyprintf 提供了两种 printf
变体:printf
和 sprintf
系列函数:snprintf
, sprintf
,vsnprintf
, vsprintf
。
tinyprintf 支持的格式包括:c
, d
, i
, o
, p
, u
, s
, x
, X
。并且支持零填充和字段宽度。不支持浮点型。
要使用 printf,你需要提供自己的字符输出函数,像这样:
void putc ( void* p, char c)
{
while (!SERIAL_PORT_EMPTY) ;
SERIAL_PORT_TX_REGISTER = c;
}
然后进行初始化:
init_printf(NULL, putc);
接下来就可以使用 printf
了。
tinyprintf 的代码是可重入的,除了init_printf
函数。可以在中断中安全地调用printf
,但是这可能会导致混合输出。如果你依赖重入,需要注意你的 putc
函数是可重入的。
tinyprintf 的使用十分简单,直接使用printf
和 sprintf
系列函数:snprintf
, sprintf
,vsnprintf
, vsprintf
。printf
和 sprintf
函数实际上是宏,当设置 TINYPRINTF_OVERRIDE_LIBC
时转换为 tfp_printf
和 tfp_sprintf
。默认TINYPRINTF_OVERRIDE_LIBC
启用。如果设置TINYPRINTF_OVERRIDE_LIBC
为 0 时,可以使用如下函数:
void init_printf(void *putp, putcf putf);
void tfp_printf(char *fmt, ...);
int tfp_vsnprintf(char *str, size_t size, const char *fmt, va_list ap);
int tfp_snprintf(char *str, size_t size, const char *fmt, ...);
int tfp_vsprintf(char *str, const char *fmt, va_list ap);
int tfp_sprintf(char *str, const char *fmt, ...);
注意 tinyprintf 库的tfp_printf
没有返回值,为void
。
下面通过例程展示几个基本的操作。
#include <stdio.h>
#include <unistd.h>
#define TINYPRINTF_DEFINE_TFP_PRINTF 1
#define TINYPRINTF_DEFINE_TFP_SPRINTF 1
#define TINYPRINTF_OVERRIDE_LIBC 0
#include "tinyprintf.h"
static void stdout_putf(void *unused, char c)
{
(void)(unused);
putchar(c);
}
int main(int argc, char* argv[])
{
//初始化
init_printf(NULL, stdout_putf);
tfp_printf("%d\n", 123); //输出"123"
char str[10] = {0};
//把 678 写入到了str数组中
tfp_sprintf(str, "%d", 678);
printf("%s\n", str); //输出"678"
return 0;
}
最基本的操作就是这样了,其他更详细的用法可以查看这个 tinyprintf 项目的test
目录,printf
示例程序printf.c和sprintf
示例程序sprintf.c。
本文链接:https://blog.csdn.net/u012028275/article/details/133624875