【开源项目】tinyprintf 用于嵌入式系统的小型printf和sprintf库

【开源项目】tinyprintf 用于嵌入式系统的小型printf和sprintf库

简介

tinyprintf 是一个用于小型嵌入式系统的微型 printf 和 sprintf 库。这个库实际上只由两个文件 tinypprintf.ctinyprintf.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 变体:printfsprintf 系列函数:snprintfsprintfvsnprintfvsprintf

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 的使用十分简单,直接使用printfsprintf 系列函数:snprintfsprintfvsnprintfvsprintfprintfsprintf 函数实际上是宏,当设置 TINYPRINTF_OVERRIDE_LIBC时转换为 tfp_printftfp_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 
#include 

#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

你可能感兴趣的:(开源项目,开源,github,c语言)