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

这篇具有很好参考价值的文章主要介绍了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类的打印

  • 代码不可裁剪;文章来源地址https://www.toymoban.com/news/detail-738132.html

到了这里,关于arm-none-eabi-gcc下实现printf的两种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

    搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

    Arm-none-eabi-gcc + Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板 一、本次环境搭建所用的软硬件 1)Windows or Linux (本文以Windows为主) 2)JLink、Daplink、Wch-Link烧录器 3)GNU Arm Embedded Toolchain交叉编译器 4)Mingw-w64 GCC for Windows 64 5)Debug 调试工具 openocd 6)Visual Studio Code 二、软件安装配置 GNU Arm

    2024年02月03日
    浏览(7)
  • ARM交叉编译工具链 gcc-arm-none-eabi

    1,交叉编译工具链简介 (1)命令规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch – 体系架构ÿ

    2024年03月25日
    浏览(6)
  • arm-none-eabi-size 查看内存映像大小

    一、概述 1.1 功能 1.2 命令格式 1.3 支持的目标文件 二、基本应用示例 2.1 查看单个对象文件 2.2 查看整个工程的内存映像 三、命令选项描述 3.1 以不同的进制格式显示内存映像 示例:以十六进制格式显示 3.2 不同的输出方式 3.2.1 可选的表示方式与对应的选项 3.2.2 -A (–format=

    2024年02月09日
    浏览(15)
  • [linux]Ubuntu 18.04安装arm-linux-gcc交叉编译器的两种方法

    [linux]Ubuntu 18.04安装arm-linux-gcc交叉编译器的两种方法

    第一种:apt安装法: Ctrl+Alt+T弹出终端,使用如下命令进行arm-linux-gcc的安装:   使用如下命令进行arm-linux-g++的安装:   如果要卸载时使用如下命令进行移除,arm-linux-gcc的卸载:   arm-linux-g++的卸载:  第二种源码安装: 目前网上搜索发现,最多人安装的是4.4.3版本的

    2024年02月05日
    浏览(10)
  • vscode 无法使用 compilerPath“D:.../bin/arm-none-eabi-g++.exe”解析配置。

    vscode 无法使用 compilerPath“D:.../bin/arm-none-eabi-g++.exe”解析配置。

            最近在使用vscode搭建ODrive STM32开发环境,依次安装了以下内容:                 1.Python3: 用于运行工程构建脚本                 2.ST-Link/V2 Drivers: STLink/v2编程器的驱动                 3.Visual Studio Code: 轻量级但功能强大的源代码编辑器      

    2024年02月08日
    浏览(14)
  • S32DS导入工程后报错:“Program ‘arm-none-eabi-g++‘not found in PATH“

    S32DS导入工程后报错:“Program ‘arm-none-eabi-g++‘not found in PATH“

    导入已有的工程后,编译报错\\\"Program \\\'arm-none-eabi-g++\\\'not found in PATH\\\"、\\\"Program \\\'arm-none-eabi-gcc\\\'not found in PATH\\\" 分析原因:编译器找不到arm-none-eabi指令的路径 解决方法: 在工程属性中配置PATH,恢复为默认配置即可(会找到之前安装的路径) 恢复默认后,应用并关闭,错误解决

    2024年02月03日
    浏览(13)
  • 【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误

    【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误

    目录 1 Error错误提示 2 Error错误原因 3 如何消除Error错误 结尾 【S32K3_MCAL从入门到精通】合集: S32K3_MCAL从入门到精通 https://blog.csdn.net/qfmzhu/category_12519033.html 使用S32DS+J-LinK 下载程序,在Dedug Configurations…, 并单击Debug ,弹出如下错误: Launching FreeRTOS Toggle Led Example S32K344 Debug F

    2024年01月19日
    浏览(15)
  • GCC - 基于win10平台搭建Cmake + MinGW + gcc-arm-none 开源开发环境

    GCC - 基于win10平台搭建Cmake + MinGW + gcc-arm-none 开源开发环境

    基于GUN开源工具链,搭建Windows平台下 ARM 编译运行环境! 🐱‍🚀 文中涉及的开发工具包已打包上传 ,可点击此处下载。 1、 建议直接下载安装git (内部集成有该工具),也可点击此处单独下载Git Bash工具; 2、如无法直接调用,添加对应环境变量; 32位下载地址:  MinG

    2024年02月10日
    浏览(13)
  • 解决Ubuntu下arm-none-linux-gnueabihf-gcc -v :未找到命令

    解决Ubuntu下arm-none-linux-gnueabihf-gcc -v :未找到命令

    问题:arm-none-linux-gnueabihf-gcc -v arm-none-linux-gnueabihf-gcc:未找到命令 学习MP135开发板搭建环境之后没gcc不可用,网上找了很多教程都没法解决 解决方法: 1、重启:(我试了没用) 2、使用source 命令刷新 结果验证  关于source 命令的解释 在 Linux 中, source 命令用于在当前 shell

    2024年02月16日
    浏览(11)
  • Linux下编译arm 32 出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    一、arm-none-linux-gnueabi-gcc不能再64位系统下下编译ARM的32位库的问题解决方法如下: sudo apt-get install lib32stdc++6 sudo apt-get install lib32ncurses5 sudo apt-get install lib32z1 二、交叉编译工具没有写入环境变量或写错,重新写入环境变量 将交叉编译工具 bin 目录添加到系统 PATH 环境变量中:

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包