当前位置: 首页 > news >正文

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.lryc.cn/news/215197.html

相关文章:

  • 组件库开发
  • 【python基础】魔法参数*args, **kwargs的使用
  • Android Icon 添加水印 Python脚本
  • 选择Centos系统需不需要带SElinux?
  • 项目级asp.net框架的LIMS实验室管理系统源码
  • pthread 变量静态初始化 避免使用被销毁过的变量
  • 深度学习之基于ResNet18的神经网络水果分类系统
  • 并查集易错点
  • 车载网关产品解析(附:车载网关详细应用案例及部署流程)
  • 高校教务系统登录页面JS分析——天津大学
  • 68 内网安全-域横向PTHPTKPTT哈希票据传递
  • 【1】2023版密评算分工具
  • 人工智能常用网站
  • OpenLayers实战,OpenLayers结合下拉菜单实现城市切换,动态切换城市边界到地图视图视角范围内
  • UE5 日记(人物连招:蒙太奇动画通知(含视频链接))
  • 葡萄酒是如何从葡萄园到你的酒杯的?
  • Oracle Exadata X7-2掉电宕机导致集群无法启动处理过程
  • 锐捷RG-EW1200G登录绕过漏洞复现
  • Python之循环语句
  • python中使用websocket调用、获取、保存大模型API
  • Linux的账号管理
  • 优优嗨聚集团:医保新政来袭,乙类OTC、保健品或将退出医保舞台,影响几何?
  • ubuntu安装pandora-gpt
  • PHP校验身份证号是否正确
  • [C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)
  • D. Doremy‘s Connecting Plan Codeforces Round 906 (Div. 2)
  • Prometheus+Grafana
  • CoCa论文笔记
  • uniapp 微信小程ios端键盘弹起后导致页面无法滚动
  • 三维模型优势在哪里?如何提升产品自身商业价值?