arm-none-eabi-gcc下实现printf的两种方式

方式1,移植第三方printf库:

1. 下载地址:https://github.com/mpaland/printf

2. 拷贝其中的printf.c和printf.h到本地;

3. 重新实现 void _putchar(char character) 接口,使用具体串口发送ch数据,如在 uart_hal.c中重新实现该接口:

void _putchar(char character)
{UART_TypeDef *base = g_uart_bases[UART_CONSOLE_INSTANCE];uint32_t tmp_d = character;tmp_d &= 0xff;uart_drv_fput_char(base, tmp_d);
}

使用时可通过在printf.c开头部分或printf.h中增加或注释如下宏定义来关闭或开启特定打印模式:

#define PRINTF_DISABLE_SUPPORT_FLOAT        // 是否支持 %f 类的打印
#define PRINTF_DISABLE_SUPPORT_EXPONENTIAL // 是否支持 %e 类的打印
#define PRINTF_DISABLE_SUPPORT_LONG_LONG   // 是否支持 %lld 类的打印
#define PRINTF_DISABLE_SUPPORT_PTRDIFF_T  // 是否支持 %ld 类的打印

方式2,重新实现系统调用:

1. 新增syscall.c文件,在其中添加如下代码:

extern int __io_putchar(int ch);int _write(int file, char *ptr, int len)
{int DataIdx;for (DataIdx = 0; DataIdx < len; DataIdx++){__io_putchar( *ptr++ );}return len;
}

2. 重新实现 int __io_putchar(int ch) 接口,使用具体串口发送ch数据,如在 uart_hal.c中重新实现该接口:

int __io_putchar(int ch)
{UART_TypeDef *base = g_uart_bases[UART_CONSOLE_INSTANCE];uart_drv_fput_char(base, ch);return ch;
}

两种printf实现方式的比较:

移植第三方printf库的优缺点:

优点:

  • 除几个标准库外不依赖其他实现;

  • 可单独控制 %f,%e,%lld,%ld格式的打印实现,可根据需要精确控制;

  • 可更进一步对代码进行裁剪,如不使用sprintf类接口可对相关代码进行裁剪;

  缺点:

  • 相同优化等级下比实现系统调用方式代码体积大一些(只支持%d %s打印时在opt=O2时比前者大1.7kb);

重新实现系统调用方式的优缺点:

优点:

  • 相同优化等级下比移植第三方库代码体积小一些;

  缺点:

  • 不支持%f,%e,%lld类的打印

  • 代码不可裁剪;

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

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

相关文章

C++:关联式容器set的介绍

1、set的介绍 set是按照一定次序存储元素的容器 在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可以从容器中插入或删除它们。 在内部&#…

如何在Vue3项目中使用防抖节流技巧

前言 防抖节流是可以说是一种优化组件性能的技巧&#xff0c;可以有效减少组件中的渲染次数和计算量&#xff0c;从而提高组件的响应速度和用户体验。在Vue3中可以使用lodash库中的debounce和throttle函数来分别实现防抖和节流。当然也可以自行设计实现防抖节流函数&#xff0…

ES替换某个索引下的字段的值

ES替换某个索引下的字段的值 前言 在ES的操作中&#xff0c;如果我们已经同步完所有的索引&#xff0c;但是发现同步的时候数据出现了失误&#xff0c;那么在数据量很大的情况下还是要避免重新同步&#xff0c;这个时候就用到了更新替换操作&#xff1a; 操作1 针对于name字…

使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示&#xff0c;RAG为LLM提供了有用的上下文&#xff0c;以产生基于事实的输出。 但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在…

讲座分享|《追AI的人》——中国科学技术大学张卫明教授分享《人工智能背景下的数字水印》

本篇博客记录 2023年11月1日 《人工智能背景下的数字水印》 讲座笔记。 先来明确一下水印在信息隐藏中的定位&#xff0c;如下图&#xff1a; 目录 概述AI for Watermark图像传统攻击方式&#xff08;如JPEG压缩&#xff09;跨媒介攻击方式&#xff08;屏摄&#xff09; 文档水…

自动驾驶常用英文表述

英文单词 英文单词单词意义ego自车&#xff0c;特指自动驾驶汽车自己yield车辆&#xff08;停下来或者减速&#xff09;从而避让其它车辆、行人side pass车辆绕行其它行驶缓慢的车辆、行人nudge车辆横向避让道路上障碍物的动作&#xff0c;与变道和借道行驶不同&#xff0c;避…

生成模型常见损失函数Python代码实现+计算原理解析

前言 损失函数无疑是机器学习和深度学习效果验证的核心检验功能&#xff0c;用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数&#xff0c;但是我们缺少细致的对损失函数进行分类&#xff0c;或者系统的学习损失函数在不同的算法…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…

升级智能监控,真香!

随着社会的发展与进步&#xff0c;传统依赖看的监控已经无法满足大众的需求&#xff0c;不够智能、识别不精准&#xff0c;传统监控的弊端也日益显现&#xff0c;智能监控升级迫在眉睫。 升级智能监控&#xff0c;不仅能够促进公共安全&#xff0c;同时也能促进社会文明的发展…

macOS 安装brew

参考链接&#xff1a; https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的&#xff1a; https://zhuanlan.zhihu.com/p/470873649

思源笔记搭建

下载docker 在 CentOS 系统上安装 Docker&#xff0c;可以按照以下步骤进行&#xff1a; 卸载旧版 Docker&#xff08;如果之前已经安装过&#xff09;&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-late…

深度学习_8_对Softmax回归的理解

回归问题&#xff0c;例如之前做房子价格预测的线性回归问题 而softmax回归是一个分类问题,即给定一个图片&#xff0c;从猫狗两种动物类别中选出最可靠的那种答案&#xff0c;这个是两类分类问题&#xff0c;因为狗和猫是两类 上述多个输出可以这样理解&#xff0c;假设一个图…

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、简单使用1.First、在project下的build.gradle添加2.按需导入3. 常用代码 rtsp流的优化大功告成 总结 前言 本文介绍&#xff0c;…

BUUCTF 另外一个世界 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一个.jpg图片。 密文&#xff1a; 解题思路&#xff1a; 1、这道题我尝试了很多方法&#xff0c;知道看了别人的wp才知道flag在我忽略的地方。将图片在010 Editor中打开&#xff0c;从…

服装手机壳抱枕diy来图定制小程序开发

服装手机壳抱枕diy来图定制小程序开发 一、我们的定位与特色 首先&#xff0c;我们是一个多元化商品定制商城。与其他商城不同的是&#xff0c;我们致力于提供全方位的定制服务&#xff0c;包括手机壳、抱枕、服装、水杯贴图等各类商品。 此外&#xff0c;我们还提供冲洗照片…

PostgreSQL 进阶 - 使用foreign key,使用 subqueries 插入,inner joins,outer joins

1. 使用foreign key 创建 table CREATE TABLE orders( order_id SERIAL PRIMARY KEY, purchase_total NUMERIC, timestamp TIMESTAMPTZ, customer_id INT REFERENCES customers(customer_id) ON DELETE CASCADE);“order_id”&#xff1a;作为主键的自增序列&#xff0c;使用 …

学习笔记二十八:K8S控制器Daemonset入门到企业实战应用

DaemonSet控制器&#xff1a;概念、原理解读 DaemonSet概述DaemonSet工作原理&#xff1a;如何管理PodDaemonset典型的应用场景DaemonSet 与 Deployment 的区别DaemonSet资源清单文件编写技巧 DaemonSet使用案例&#xff1a;部署日志收集组件fluentdDaemonset管理pod&#xff1…

nexus搭建npm私有镜像

假设有一个nexus服务&#xff0c;地址为&#xff1a; http://10.10.33.50:8081/ 创建存储空间 登录后创建存储空间&#xff0c;选择存储类型为File&#xff0c;并设置空间名称为 npm-private 创建仓库类型 2.1 创建hosted类型仓库 创建一个名为 npm-hosted 的本地类型仓库 2.…

天空卫士在全球和中国两大报告中被Gartner列为推荐和代表性供应商

DLP连续五年被Gartner 列为推荐厂商的理由 Gartner2023年9月份发布的《Gartner全球企业数据防泄露市场指南》中&#xff0c;天空卫士被列为DLP领域代表供应商&#xff0c;包括EDLP、IDLP和云原生DLP。 这已经是天空卫士第五次入选《Gartner全球企业数据防泄露市场指南》。天空…

Java基础之类型(内涵面试题)

目录 一、自动类型转换&#xff1a; 二、强制类型转换&#xff1a; 1.强制类型转换可能造成数据丢失&#xff08;溢出&#xff09;。 2.浮点型强转成整型&#xff0c;直接丢掉小数部分&#xff0c;保留整数部分返回。 三、自增、自减&#xff08;、--&#xff09;有关面试题…