【开源项目】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 <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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务技术栈-Docker应用部署

文章目录 前言一、数据卷二、Docker 应用部署1、MySQL部署2、Tomcat部署3、Nginx部署4、Redis部署5、Kafka部署 总结 前言 之前文章讲到过&#xff0c;docker运行程序的过程就是去仓库把镜像拉到本地&#xff0c;然后用一条命令把镜像运行起来变成容器&#xff0c;接下来我们将…

数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

vue 使用 创建二维数组响应数据 渲染 echarts图标

目前我遇到的情况就是用动态的二维数组数据渲染echarts图标&#xff0c;我们从后端收到的接口一般是个一维数组&#xff0c;需要手动构建并且保证响应式。接下来我做了个案例 一、案例总逻辑 1. 先创建一个vue项目 2. 添加 echarts依赖 3. 模拟数据请求&#xff0c;构建二维数组…

DevicData-D-XXXXXXXX勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言&#xff1a; 在数字时代&#xff0c;数据安全成为一项至关重要的挑战。DevicData-D-XXXXXXXX勒索病毒&#xff08;以下简称DevicData病毒&#xff09;是这场战斗中的新敌人&#xff0c;它能够以毁灭性的方式加密您的数据&#xff0c;迫使您在数据和时间之间做出艰难的选择…

59. 螺旋矩阵 II

题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;n …

AcWing 288. 休息时间,《算法竞赛进阶指南》,环形与后效性处理

288. 休息时间 - AcWing题库 在某个星球上&#xff0c;一天由 N 个小时构成&#xff0c;我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时&#xff0c;以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛&#xff0c;它每天要休息 B 个小…

基于SpringBoot的房屋租赁管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 屋主管理 房屋信息管理 房屋租赁公告 租用订单管理 房屋信息管理 保洁管理 房屋信息 租用订单管理 取消订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 互联网发展至今&#xff0c;无论是其理论还是…

【面试题精讲】如果一个类没有声明构造方法,该程序能正确执行吗?

“ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是构造方法? 构造方法&#xff08;Constructor&#xff09;是一种特殊的方法&#x…

Centos 服务器 MySQL 8.0 快速开启远程访问

环境&#xff1a; MySQL 8.0&#xff08;低版本会有些不同&#xff09;&#xff0c; Rocky Linux 9.0&#xff08;CentOS&#xff09; 直接上干货&#xff0c;相信大家看到这个文章的时候都已经安装完了。 1. 先从服务器上使用 root 进行登录&#xff08;刚安装完默认只能本地…

java Spring Boot在配置文件中关闭热部署

之前更大家一起搭建了一个热部署的开发环境 但是 大家要清楚一个情况 我们线上程序运行突然内部发生变化这是不可能的。 所以 他就只会对我们开发环境有效 是否开启 我们可以通过 application配置文件来完成 我这里是yml格式的 参考代码如下 spring:devtools:restart:enabled…

OpenWrt使用Privoxy插件修改UA

OpenWrt使用privoxy修改UA 1.安装privoxy插件 SSH连接到路由器 更新插件列表 update opkg安装插件 opkg install privoxy luci-app-privoxy luci-i18n-privoxy-zh-cn重启路由器 2.配置privoxy 打开配置页面 文件和目录 访问和控制 转发 杂项 日志 编辑配置 浏览器打开 …

代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离

目录 583. 两个字符串的删除操作思路思路2代码 72. 编辑距离思路代码 583. 两个字符串的删除操作 Leetcode 思路 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。递推公…

云原生Kubernetes:简化K8S应用部署工具Helm

目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…

volatile关键字使用总结

先说结论 1. volatile关键字可以让编译器层面减少优化&#xff0c;每次使用时必须从内存中取数据&#xff0c;而不是从cpu缓存或寄存器中获取 2. volatile关键字不能完全禁止指令重排&#xff0c;准确地说是两个volatile修饰的变量之间的命令不会进行指令重排 3. 使用volati…

模板方法模式,基于继承实现的简单的设计模式(设计模式与开发实践 P11)

文章目录 实现举例应用钩子 Hook 模板方法模式是一种基于继承的设计模式&#xff0c;由两部分构成&#xff1a; 抽象父类&#xff08;一般封装了子类的算法框架&#xff09;具体的实现子类 实现 简单地通过继承就可以实现 举例 足球赛 和 篮球赛 都有 3 个步骤&#xff0c…

常用Redis界面化软件

对于Redis的操作&#xff0c;前期有过介绍【Centos 下安装 Redis 及命令行操作】。而在Redis的日常开发调试中&#xff0c;可使用可视化软件方便进行操作。 本篇主要介绍Redis可视化的两款工具&#xff1a;Redis Desktop Manager和AnotherRedisDesktopManager。 1、Redis Desk…

C# 图解教程 第5版 —— 第1章 C# 和 .NET 框架

文章目录 1.1 在 .NET 之前1.2 .NET 时代1.2.1 .NET 框架的组成1.2.2 大大改进的编程环境 1.3 编译成 CIL1.4 编译成本机代码并执行1.5 CLR1.6 CLI1.7 各种缩写1.8 C# 的演化1.9 C# 和 Windows 的演化&#xff08;*&#xff09; 1.1 在 .NET 之前 MFC&#xff08;Microsoft Fou…

组合模式,宏指令和普通指令的聚合应用(设计模式与开发实践 P10)

文章目录 定义举例抽象类文件系统常用 程序设计中有一些 事物是由相似的子事物 构成的例子 定义 回顾过去的命令模式&#xff0c;有一些命令里面包含了一个序列的操作&#xff0c;如果你玩魔兽世界或者类似的 MMO 游戏&#xff0c;里面你会用到 宏指令&#xff0c;就是一个指…

[python 刷题] 4 Median of Two Sorted Arrays

[python 刷题] 4 Median of Two Sorted Arrays 题目&#xff1a; Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. The overall run time complexity should be O ( l o g ( m n ) ) O(log (mn)) O(lo…

设计模式探索:从理论到实践的编码示例 (软件设计师笔记)

&#x1f600;前言 设计模式&#xff0c;作为软件工程领域的核心概念之一&#xff0c;向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码&#xff0c;而且也促进了代码的复用性。通过这篇文章&#xff0c;我们…