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中重新实现该接口:

cpp 复制代码
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中增加或注释如下宏定义来关闭或开启特定打印模式:

cpp 复制代码
#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文件,在其中添加如下代码:
cpp 复制代码
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;
}
  1. 重新实现 int __io_putchar(int ch) 接口,使用具体串口发送ch数据,如在 uart_hal.c中重新实现该接口:
cpp 复制代码
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类的打印;

  • 代码不可裁剪;

相关推荐
Discipline~Hai2 天前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式
byte轻骑兵3 天前
BlueZ源码编译环境配置全指南:Linux桌面原生编译 + 嵌入式ARM交叉编译 + 定制裁剪与调试实战
linux·arm开发·蓝牙·bluez·电脑蓝牙
武汉万象奥科4 天前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机
zlinear数据采集卡4 天前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
透明的玻璃杯4 天前
Arm屏幕
arm开发
Fu_Lin_4 天前
Qt嵌入式从零基础到精通(01):Qt嵌入式开发全景图:从桌面Qt到ARM Linux
linux·arm开发·qt·qt5·嵌入式linux
XMAIPC_Robot5 天前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
亿道电子Emdoor5 天前
【Arm】CoreSight ATB 简介
arm开发
Dlrb12115 天前
ARM---IMX6ULL定时器详解与应用:EPIT与GPT定时器,高精度延时函数
arm开发·gpt·arm·定时器·epit·高精度延时
Dlrb12115 天前
ARM -IMX6ULL的中断系统、GIC、CP15协处理器详细讲解
arm开发·arm·imx6ull·中断·gic·cp15·协处理器